From 6f7889cee241956262b8d8b87d38c75301dd100f Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Fri, 31 Jul 2026 10:57:01 -0400 Subject: [PATCH 1/4] Add interactive Wizard UIs for Contracts MCP tools (#828) Co-authored-by: Claude --- .changeset/mcp-apps-wizard-ui.md | 7 + .../rename-confidential-erc7984-tool.md | 5 + .github/workflows/test.yml | 3 + .prettierignore | 4 +- packages/mcp/.gitignore | 2 + packages/mcp/README.md | 21 +- packages/mcp/package.json | 3 + packages/mcp/src/apps/register.test.ts | 90 +++++ packages/mcp/src/apps/register.ts | 152 ++++++++ packages/mcp/src/cairo/tools/account.ts | 22 +- packages/mcp/src/cairo/tools/custom.ts | 22 +- packages/mcp/src/cairo/tools/erc1155.ts | 22 +- packages/mcp/src/cairo/tools/erc20.ts | 22 +- packages/mcp/src/cairo/tools/erc721.ts | 22 +- packages/mcp/src/cairo/tools/governor.ts | 22 +- packages/mcp/src/cairo/tools/multisig.ts | 22 +- packages/mcp/src/cairo/tools/vesting.ts | 22 +- .../mcp/src/confidential/tools/erc7984.ts | 24 +- packages/mcp/src/helpers.test.ts | 2 + packages/mcp/src/server.test.ts | 84 +++- packages/mcp/src/server.ts | 5 + packages/mcp/src/solidity/tools/account.ts | 22 +- packages/mcp/src/solidity/tools/custom.ts | 22 +- packages/mcp/src/solidity/tools/erc1155.ts | 22 +- packages/mcp/src/solidity/tools/erc20.ts | 22 +- packages/mcp/src/solidity/tools/erc721.ts | 22 +- packages/mcp/src/solidity/tools/governor.ts | 22 +- packages/mcp/src/solidity/tools/rwa.ts | 26 +- packages/mcp/src/solidity/tools/stablecoin.ts | 22 +- packages/mcp/src/stellar/tools/fungible.ts | 22 +- packages/mcp/src/stellar/tools/governor.ts | 22 +- .../mcp/src/stellar/tools/non-fungible.ts | 22 +- packages/mcp/src/stellar/tools/stablecoin.ts | 22 +- packages/mcp/src/stellar/tools/vault.ts | 22 +- packages/mcp/src/stylus/tools/erc1155.ts | 22 +- packages/mcp/src/stylus/tools/erc20.ts | 22 +- packages/mcp/src/stylus/tools/erc721.ts | 22 +- packages/mcp/src/uniswap-hooks/tools/hooks.ts | 23 +- packages/mcp/src/utils.ts | 53 +-- packages/ui/package.json | 4 +- packages/ui/rollup.mcp-apps.config.mjs | 88 +++++ packages/ui/scripts/package-mcp-apps.mjs | 92 +++++ packages/ui/src/common/HelpTooltip.svelte | 18 +- packages/ui/src/common/external-links.ts | 20 + packages/ui/src/mcp-apps/KindApp.svelte | 84 ++++ packages/ui/src/mcp-apps/KindShell.svelte | 366 ++++++++++++++++++ packages/ui/src/mcp-apps/adapter.ts | 34 ++ packages/ui/src/mcp-apps/cairo/adapter.ts | 41 ++ .../ui/src/mcp-apps/confidential/adapter.ts | 27 ++ packages/ui/src/mcp-apps/deliver-contract.ts | 93 +++++ .../ui/src/mcp-apps/entries/cairo-account.ts | 4 + .../ui/src/mcp-apps/entries/cairo-custom.ts | 4 + .../ui/src/mcp-apps/entries/cairo-erc1155.ts | 4 + .../ui/src/mcp-apps/entries/cairo-erc20.ts | 4 + .../ui/src/mcp-apps/entries/cairo-erc721.ts | 4 + .../ui/src/mcp-apps/entries/cairo-governor.ts | 4 + .../ui/src/mcp-apps/entries/cairo-multisig.ts | 4 + .../ui/src/mcp-apps/entries/cairo-vesting.ts | 4 + .../mcp-apps/entries/confidential-erc7984.ts | 4 + .../src/mcp-apps/entries/solidity-account.ts | 4 + .../src/mcp-apps/entries/solidity-custom.ts | 4 + .../src/mcp-apps/entries/solidity-erc1155.ts | 4 + .../ui/src/mcp-apps/entries/solidity-erc20.ts | 4 + .../src/mcp-apps/entries/solidity-erc721.ts | 4 + .../src/mcp-apps/entries/solidity-governor.ts | 4 + .../ui/src/mcp-apps/entries/solidity-rwa.ts | 4 + .../mcp-apps/entries/solidity-stablecoin.ts | 4 + .../src/mcp-apps/entries/stellar-fungible.ts | 4 + .../src/mcp-apps/entries/stellar-governor.ts | 4 + .../mcp-apps/entries/stellar-non-fungible.ts | 4 + .../mcp-apps/entries/stellar-stablecoin.ts | 4 + .../ui/src/mcp-apps/entries/stellar-vault.ts | 4 + .../ui/src/mcp-apps/entries/stylus-erc1155.ts | 4 + .../ui/src/mcp-apps/entries/stylus-erc20.ts | 4 + .../ui/src/mcp-apps/entries/stylus-erc721.ts | 4 + .../ui/src/mcp-apps/entries/uniswap-hooks.ts | 4 + packages/ui/src/mcp-apps/mount.ts | 62 +++ packages/ui/src/mcp-apps/opts-snapshot.ts | 28 ++ packages/ui/src/mcp-apps/solidity/adapter.ts | 40 ++ packages/ui/src/mcp-apps/stellar/adapter.ts | 34 ++ packages/ui/src/mcp-apps/styles.ts | 1 + packages/ui/src/mcp-apps/stylus/adapter.ts | 30 ++ .../ui/src/mcp-apps/uniswap-hooks/adapter.ts | 27 ++ yarn.lock | 100 ++++- 84 files changed, 1927 insertions(+), 376 deletions(-) create mode 100644 .changeset/mcp-apps-wizard-ui.md create mode 100644 .changeset/rename-confidential-erc7984-tool.md create mode 100644 packages/mcp/.gitignore create mode 100644 packages/mcp/src/apps/register.test.ts create mode 100644 packages/mcp/src/apps/register.ts create mode 100644 packages/ui/rollup.mcp-apps.config.mjs create mode 100644 packages/ui/scripts/package-mcp-apps.mjs create mode 100644 packages/ui/src/common/external-links.ts create mode 100644 packages/ui/src/mcp-apps/KindApp.svelte create mode 100644 packages/ui/src/mcp-apps/KindShell.svelte create mode 100644 packages/ui/src/mcp-apps/adapter.ts create mode 100644 packages/ui/src/mcp-apps/cairo/adapter.ts create mode 100644 packages/ui/src/mcp-apps/confidential/adapter.ts create mode 100644 packages/ui/src/mcp-apps/deliver-contract.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-account.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-custom.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-erc1155.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-erc20.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-erc721.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-governor.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-multisig.ts create mode 100644 packages/ui/src/mcp-apps/entries/cairo-vesting.ts create mode 100644 packages/ui/src/mcp-apps/entries/confidential-erc7984.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-account.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-custom.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-erc1155.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-erc20.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-erc721.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-governor.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-rwa.ts create mode 100644 packages/ui/src/mcp-apps/entries/solidity-stablecoin.ts create mode 100644 packages/ui/src/mcp-apps/entries/stellar-fungible.ts create mode 100644 packages/ui/src/mcp-apps/entries/stellar-governor.ts create mode 100644 packages/ui/src/mcp-apps/entries/stellar-non-fungible.ts create mode 100644 packages/ui/src/mcp-apps/entries/stellar-stablecoin.ts create mode 100644 packages/ui/src/mcp-apps/entries/stellar-vault.ts create mode 100644 packages/ui/src/mcp-apps/entries/stylus-erc1155.ts create mode 100644 packages/ui/src/mcp-apps/entries/stylus-erc20.ts create mode 100644 packages/ui/src/mcp-apps/entries/stylus-erc721.ts create mode 100644 packages/ui/src/mcp-apps/entries/uniswap-hooks.ts create mode 100644 packages/ui/src/mcp-apps/mount.ts create mode 100644 packages/ui/src/mcp-apps/opts-snapshot.ts create mode 100644 packages/ui/src/mcp-apps/solidity/adapter.ts create mode 100644 packages/ui/src/mcp-apps/stellar/adapter.ts create mode 100644 packages/ui/src/mcp-apps/styles.ts create mode 100644 packages/ui/src/mcp-apps/stylus/adapter.ts create mode 100644 packages/ui/src/mcp-apps/uniswap-hooks/adapter.ts diff --git a/.changeset/mcp-apps-wizard-ui.md b/.changeset/mcp-apps-wizard-ui.md new file mode 100644 index 000000000..7c421c17f --- /dev/null +++ b/.changeset/mcp-apps-wizard-ui.md @@ -0,0 +1,7 @@ +--- +'@openzeppelin/contracts-mcp': patch +--- + +Add MCP Apps interactive UIs for Wizard-backed generation tools. +- Each tool serves a fixed-kind Wizard controls + code preview App with Send Updates to Agent / Copy to Clipboard. +- Non-Apps clients still receive Markdown source from tools/call. diff --git a/.changeset/rename-confidential-erc7984-tool.md b/.changeset/rename-confidential-erc7984-tool.md new file mode 100644 index 000000000..eeb0a20e7 --- /dev/null +++ b/.changeset/rename-confidential-erc7984-tool.md @@ -0,0 +1,5 @@ +--- +'@openzeppelin/contracts-mcp': minor +--- + +- **Breaking changes**: Renamed the `erc7984` tool to `confidential-erc7984`. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bc2e04358..7c51cb0d5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -48,6 +48,9 @@ jobs: - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Set up environment uses: ./.github/actions/setup + - name: Build MCP Apps + run: yarn build:apps + working-directory: packages/mcp - name: Run tests run: yarn test working-directory: packages/mcp diff --git a/.prettierignore b/.prettierignore index d49d96ac6..089a55505 100644 --- a/.prettierignore +++ b/.prettierignore @@ -15,4 +15,6 @@ build/ public/ remappings.txt *.cairo -*.sh \ No newline at end of file +*.sh +# Generated single-file MCP App documents with an inlined bundle (yarn build:apps) +packages/mcp/apps/ diff --git a/packages/mcp/.gitignore b/packages/mcp/.gitignore new file mode 100644 index 000000000..d6068abea --- /dev/null +++ b/packages/mcp/.gitignore @@ -0,0 +1,2 @@ +# Generated MCP App HTML (built via `yarn build:apps`) +/apps/ diff --git a/packages/mcp/README.md b/packages/mcp/README.md index b997da344..a5dc2bad5 100644 --- a/packages/mcp/README.md +++ b/packages/mcp/README.md @@ -18,10 +18,29 @@ Provides tools to generate smart contract source code for the following language | solidity | erc20, erc721, erc1155, stablecoin, rwa, account, governor, custom | | cairo | erc20, erc721, erc1155, account, multisig, governor, vesting, custom | | confidential | erc7984 | -| stellar | fungible, stablecoin, non-fungible | +| stellar | fungible, stablecoin, non-fungible, governor, vault | | stylus | erc20, erc721, erc1155 | | uniswap-hooks | hooks (tool name is just `uniswap-hooks`) | +### MCP Apps + +Hosts that support the [MCP Apps](https://modelcontextprotocol.io/extensions/apps/overview) extension (for example Cursor and Claude) can render an interactive Wizard UI for each tool: the same options as the web Wizard for that contract kind, a live code preview, and a button to hand the current source back to the agent. Language and kind pickers are omitted because the tool name already selects them. + +**Send Updates to Agent** checks host MCP Apps capabilities: +- `message` (e.g. Claude): sends a chat message that includes the full current source so the agent sees option changes. Also best-effort stages via `updateModelContext` when advertised (some hosts do not attach silent context to draft-injected messages, so the message itself must be self-contained). +- No `message` capability (e.g. Cursor today, including hosts that only advertise `updateModelContext`): the button is **Copy to Clipboard** (same idea as the web Wizard copy action). +- Outbound links (tooltip “Read more”, import hyperlinks in the preview) use the host `openLinks` capability via `openLink`. If the host does not advertise it, those links are hidden so nothing looks clickable that cannot open. + +Clients without Apps support continue to work — tools still return source code as Markdown text. The server always returns tool text; hosts that do not implement MCP Apps simply ignore the UI metadata. + +#### App HTML artifacts + +Interactive App HTML is **not** committed to git. It is generated into `packages/mcp/apps/` and included in the published npm tarball. + +- **Published package (`npm` / `npx`)**: Apps HTML is already in the package; no extra build step. +- **Local checkout** (Cursor/Claude pointed at `packages/mcp/dist/cli.js`, or a `file:` dependency): run `yarn --cwd packages/mcp build:apps` after cloning or changing MCP App UI sources. If HTML is missing, the server fails closed at startup with a message to run that command (npm consumers should reinstall or report a packaging bug). +- **CI / publish**: CI builds Apps before MCP tests; `prepublishOnly` builds Apps before npm publish. + ## Installation diff --git a/packages/mcp/package.json b/packages/mcp/package.json index a8602f2ee..0313bea41 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -13,10 +13,13 @@ "NOTICE", "/dist", "/src", + "/apps", "!**/*.test.*" ], "scripts": { + "build:apps": "yarn --cwd ../ui build:mcp-apps", "prepare": "tsc", + "prepublishOnly": "yarn build:apps", "watch": "tsc --watch", "test": "ava", "test:update-snapshots": "ava --update-snapshots", diff --git a/packages/mcp/src/apps/register.test.ts b/packages/mcp/src/apps/register.test.ts new file mode 100644 index 000000000..50abbf98e --- /dev/null +++ b/packages/mcp/src/apps/register.test.ts @@ -0,0 +1,90 @@ +import test from 'ava'; +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { testMcpInfo } from '../helpers.test'; +import { appResourceUri, readAppHtml, registerWizardAppTool, RESOURCE_MIME_TYPE, wizardAppResult } from './register'; +import { registerSolidityERC20 } from '../solidity/tools/erc20'; + +test('solidity-erc20 registers UI metadata', t => { + const server = new McpServer(testMcpInfo); + const tool = registerSolidityERC20(server); + const ui = tool._meta?.ui as { resourceUri?: string } | undefined; + t.is(ui?.resourceUri, appResourceUri('solidity-erc20')); + t.is(tool._meta?.['ui/resourceUri'], appResourceUri('solidity-erc20')); +}); + +test('MCP App HTML artifacts exist for Wizard-backed tools', async t => { + // One tool per language; registerWizardAppTool fails closed for the rest at server start. + const tools = [ + 'solidity-erc20', + 'solidity-erc721', + 'cairo-erc20', + 'stellar-fungible', + 'stylus-erc20', + 'confidential-erc7984', + 'uniswap-hooks', + ]; + for (const tool of tools) { + const html = await readAppHtml(tool); + t.true(html.includes(''), `${tool} missing doctype`); + t.true(html.includes(' + + +`; + const outPath = path.join(outDir, `${name}.html`); + await fsp.writeFile(outPath, html); + console.log(`Wrote ${outPath} (${Math.round(html.length / 1024)} KiB)`); + }), +); + +if (only) { + console.log(`Packaged MCP App "${only}" (other apps left unchanged).`); +} else { + console.log(`Verified ${expectedNames.length} MCP App HTML artifacts match entries.`); +} diff --git a/packages/ui/src/common/HelpTooltip.svelte b/packages/ui/src/common/HelpTooltip.svelte index e6adda7f9..bc5b039d5 100644 --- a/packages/ui/src/common/HelpTooltip.svelte +++ b/packages/ui/src/common/HelpTooltip.svelte @@ -1,8 +1,20 @@ @@ -15,9 +27,11 @@
- {#if link} + {#if showLink}
- Read more. + Read more. {/if}
diff --git a/packages/ui/src/common/external-links.ts b/packages/ui/src/common/external-links.ts new file mode 100644 index 000000000..00277ad1f --- /dev/null +++ b/packages/ui/src/common/external-links.ts @@ -0,0 +1,20 @@ +import type { Writable } from 'svelte/store'; + +/** Svelte context key for MCP Apps outbound link handling. */ +export const MCP_EXTERNAL_LINKS_CONTEXT = 'mcp-external-links'; + +/** + * Set by MCP Apps (KindShell), unset in the web Wizard. + * + * When set, outbound links render as plain `` and a capture-phase delegate in + * KindShell routes the click through the host's `openLink` — so consumers only need to + * know whether opening a link is possible at all, and hide the link when it is not. + * When unset, the web Wizard keeps normal `` links. + * + * Stored as a writable so consumers re-render when `openLinks` arrives after connect. + */ +export type McpExternalLinks = { + canOpen: boolean; +}; + +export type McpExternalLinksStore = Writable; diff --git a/packages/ui/src/mcp-apps/KindApp.svelte b/packages/ui/src/mcp-apps/KindApp.svelte new file mode 100644 index 000000000..2f9c4066f --- /dev/null +++ b/packages/ui/src/mcp-apps/KindApp.svelte @@ -0,0 +1,84 @@ + + + + + + + diff --git a/packages/ui/src/mcp-apps/KindShell.svelte b/packages/ui/src/mcp-apps/KindShell.svelte new file mode 100644 index 000000000..293ca7a6c --- /dev/null +++ b/packages/ui/src/mcp-apps/KindShell.svelte @@ -0,0 +1,366 @@ + + +
+
+
+ +
+ +
+ + +
+        {@html highlightedCode}
+      
+
+
+ + +
+ + diff --git a/packages/ui/src/mcp-apps/adapter.ts b/packages/ui/src/mcp-apps/adapter.ts new file mode 100644 index 000000000..a33ba91b1 --- /dev/null +++ b/packages/ui/src/mcp-apps/adapter.ts @@ -0,0 +1,34 @@ +import type { ComponentType } from 'svelte'; + +/** Per-field validation messages, structurally identical across all Wizard languages. */ +export type KindErrors = { [prop in string]?: string }; + +/** + * Everything that differs between languages in an MCP App, expressed as data so + * `KindApp.svelte` stays the single implementation of the host protocol. + * + * Each language's adapter closes over its own Wizard package, so the generic + * component only sees opaque contracts. + */ +export type KindAdapter = { + /** Placeholder contract rendered before the host applies any options. */ + emptyContract: () => unknown; + /** Build a contract from options; throws on invalid options. */ + build: (opts: unknown) => unknown; + print: (contract: unknown) => string; + /** Per-field messages when `e` is a Wizard options error, otherwise undefined. */ + optionsErrors: (e: unknown) => KindErrors | undefined; + /** Syntax-highlight generated source, returning HTML. */ + highlight: (code: string) => string; + /** Turn import paths in highlighted HTML into docs links. */ + injectHyperlinks: (html: string) => string; + /** `hljs` theme class for the preview pane. */ + highlightClass: string; + /** Markdown fence language used when handing the contract to the agent. */ + fence: string; + /** Controls component per contract kind. */ + controls: Record; + /** Extra props for a kind's Controls component (e.g. Cairo Account's `accountType`). */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + controlProps?: (kind: string, opts: any) => Record; +}; diff --git a/packages/ui/src/mcp-apps/cairo/adapter.ts b/packages/ui/src/mcp-apps/cairo/adapter.ts new file mode 100644 index 000000000..7ff4566c6 --- /dev/null +++ b/packages/ui/src/mcp-apps/cairo/adapter.ts @@ -0,0 +1,41 @@ +import type { ComponentType } from 'svelte'; + +import type { KindedOptions, Kind } from '@openzeppelin/wizard-cairo'; +import { ContractBuilder, buildGeneric, printContract, OptionsError, macrosDefaults } from '@openzeppelin/wizard-cairo'; + +import hljs from '../../cairo/highlightjs'; +import { injectHyperlinks } from '../../cairo/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import ERC20Controls from '../../cairo/ERC20Controls.svelte'; +import ERC721Controls from '../../cairo/ERC721Controls.svelte'; +import ERC1155Controls from '../../cairo/ERC1155Controls.svelte'; +import AccountControls from '../../cairo/AccountControls.svelte'; +import MultisigControls from '../../cairo/MultisigControls.svelte'; +import GovernorControls from '../../cairo/GovernorControls.svelte'; +import VestingControls from '../../cairo/VestingControls.svelte'; +import CustomControls from '../../cairo/CustomControls.svelte'; + +const controls: Record = { + ERC20: ERC20Controls, + ERC721: ERC721Controls, + ERC1155: ERC1155Controls, + Account: AccountControls, + Multisig: MultisigControls, + Governor: GovernorControls, + Vesting: VestingControls, + Custom: CustomControls, +}; + +export const cairoAdapter = { + emptyContract: () => new ContractBuilder('MyToken', { withComponents: macrosDefaults.withComponents }), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('cairo', code).value, + injectHyperlinks, + highlightClass: '-cairo', + fence: 'cairo', + controls, + controlProps: (kind, opts) => (kind === 'Account' ? { accountType: opts?.type } : {}), +} satisfies KindAdapter; diff --git a/packages/ui/src/mcp-apps/confidential/adapter.ts b/packages/ui/src/mcp-apps/confidential/adapter.ts new file mode 100644 index 000000000..b579d6b5c --- /dev/null +++ b/packages/ui/src/mcp-apps/confidential/adapter.ts @@ -0,0 +1,27 @@ +import type { ComponentType } from 'svelte'; + +import { ContractBuilder, OptionsError } from '@openzeppelin/wizard'; +import type { KindedOptions, Kind } from '@openzeppelin/wizard-confidential'; +import { buildGeneric, printContract } from '@openzeppelin/wizard-confidential'; + +import hljs from '../../solidity/highlightjs'; +import { injectHyperlinks } from '../../confidential/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import ERC7984Controls from '../../confidential/ERC7984Controls.svelte'; + +const controls: Record = { + ERC7984: ERC7984Controls, +}; + +export const confidentialAdapter = { + emptyContract: () => new ContractBuilder('MyToken'), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('solidity', code).value, + injectHyperlinks, + highlightClass: '-solidity', + fence: 'solidity', + controls, +} satisfies KindAdapter; diff --git a/packages/ui/src/mcp-apps/deliver-contract.ts b/packages/ui/src/mcp-apps/deliver-contract.ts new file mode 100644 index 000000000..0ca9c556f --- /dev/null +++ b/packages/ui/src/mcp-apps/deliver-contract.ts @@ -0,0 +1,93 @@ +import type { App } from '@modelcontextprotocol/ext-apps'; + +export type HostSendCaps = { + message: boolean; + updateModelContext: boolean; + openLinks: boolean; +}; + +/** Pre-connect state: nothing is available until the host reports its capabilities. */ +export const NO_HOST_SEND_CAPS: HostSendCaps = { message: false, updateModelContext: false, openLinks: false }; + +/** Host rejected or user dismissed sendMessage (e.g. Claude replace-draft confirm → No). */ +export class HandoffCancelledError extends Error { + constructor(message = 'Update cancelled') { + super(message); + this.name = 'HandoffCancelledError'; + } +} + +export function readHostSendCaps(app: App): HostSendCaps { + const caps = app.getHostCapabilities(); + return { + message: caps?.message != null, + updateModelContext: caps?.updateModelContext != null, + openLinks: caps?.openLinks != null, + }; +} + +/** Send requires `message`; context-only hosts use Copy to Clipboard. */ +export function canSendToHost(caps: HostSendCaps): boolean { + return caps.message; +} + +export async function openExternalLink(app: App, url: string): Promise { + const result = await app.openLink({ url }); + if (result.isError) { + throw new Error('Host denied opening the link.'); + } +} + +const SHORT_TRIGGER = + 'I refined this contract in the Wizard UI beyond the initial MCP tool result. Here is the current generated source.'; + +function messageWithCode(fence: string, code: string): string { + // Keep single newlines; some hosts turn blank lines into paragraph spacing in the draft. + return `${SHORT_TRIGGER}\n\n\`\`\`${fence}\n${code.trimEnd()}\n\`\`\``; +} + +/** + * Deliver the current contract source to the host agent. + * + * Always put the full source in `sendMessage` when `message` is available. Some hosts + * (notably Claude's compose-draft flow) advertise `updateModelContext` but do not attach + * that silent context to the user message the app injects — so a short trigger alone + * leaves the agent without the contract. + * + * Capability matrix: + * - message (+ optional updateModelContext): self-contained chat message with full source; + * also best-effort stage via updateModelContext when advertised. + * - otherwise: caller/UI falls back to clipboard (Cursor today; context-only hosts too). + */ +export async function deliverContractToHost(app: App, code: string, fence: string): Promise { + const caps = readHostSendCaps(app); + + if (!canSendToHost(caps)) { + throw new Error('This host does not support sending the contract to the agent.'); + } + + if (caps.updateModelContext) { + try { + await app.updateModelContext({ + content: [{ type: 'text', text: code }], + }); + } catch (e) { + console.warn('[mcp-apps] updateModelContext failed', e); + } + } + + const result = await app.sendMessage({ + role: 'user', + content: [{ type: 'text', text: messageWithCode(fence, code) }], + }); + if (result.isError) { + throw new HandoffCancelledError(); + } +} + +export async function copyContractToClipboard(code: string): Promise { + if (!navigator.clipboard?.writeText) { + throw new Error('Clipboard is not available in this host.'); + } + await navigator.clipboard.writeText(code); +} diff --git a/packages/ui/src/mcp-apps/entries/cairo-account.ts b/packages/ui/src/mcp-apps/entries/cairo-account.ts new file mode 100644 index 000000000..81708e653 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-account.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'Account'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-custom.ts b/packages/ui/src/mcp-apps/entries/cairo-custom.ts new file mode 100644 index 000000000..94488da39 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-custom.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'Custom'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-erc1155.ts b/packages/ui/src/mcp-apps/entries/cairo-erc1155.ts new file mode 100644 index 000000000..79bbca455 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-erc1155.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'ERC1155'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-erc20.ts b/packages/ui/src/mcp-apps/entries/cairo-erc20.ts new file mode 100644 index 000000000..1fcdec6be --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-erc20.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'ERC20'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-erc721.ts b/packages/ui/src/mcp-apps/entries/cairo-erc721.ts new file mode 100644 index 000000000..6c225d710 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-erc721.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'ERC721'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-governor.ts b/packages/ui/src/mcp-apps/entries/cairo-governor.ts new file mode 100644 index 000000000..a9453a55d --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-governor.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'Governor'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-multisig.ts b/packages/ui/src/mcp-apps/entries/cairo-multisig.ts new file mode 100644 index 000000000..852d5dc36 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-multisig.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'Multisig'); diff --git a/packages/ui/src/mcp-apps/entries/cairo-vesting.ts b/packages/ui/src/mcp-apps/entries/cairo-vesting.ts new file mode 100644 index 000000000..561ecc9bb --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/cairo-vesting.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { cairoAdapter } from '../cairo/adapter'; + +void mountKindApp(cairoAdapter, 'Vesting'); diff --git a/packages/ui/src/mcp-apps/entries/confidential-erc7984.ts b/packages/ui/src/mcp-apps/entries/confidential-erc7984.ts new file mode 100644 index 000000000..6e30d4e50 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/confidential-erc7984.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { confidentialAdapter } from '../confidential/adapter'; + +void mountKindApp(confidentialAdapter, 'ERC7984'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-account.ts b/packages/ui/src/mcp-apps/entries/solidity-account.ts new file mode 100644 index 000000000..d377be217 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-account.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'Account'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-custom.ts b/packages/ui/src/mcp-apps/entries/solidity-custom.ts new file mode 100644 index 000000000..aa81cab4f --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-custom.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'Custom'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-erc1155.ts b/packages/ui/src/mcp-apps/entries/solidity-erc1155.ts new file mode 100644 index 000000000..b1cf17141 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-erc1155.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'ERC1155'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-erc20.ts b/packages/ui/src/mcp-apps/entries/solidity-erc20.ts new file mode 100644 index 000000000..d5bf1a895 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-erc20.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'ERC20'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-erc721.ts b/packages/ui/src/mcp-apps/entries/solidity-erc721.ts new file mode 100644 index 000000000..669e5f558 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-erc721.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'ERC721'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-governor.ts b/packages/ui/src/mcp-apps/entries/solidity-governor.ts new file mode 100644 index 000000000..a37945234 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-governor.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'Governor'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-rwa.ts b/packages/ui/src/mcp-apps/entries/solidity-rwa.ts new file mode 100644 index 000000000..997ebdd7b --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-rwa.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'RealWorldAsset'); diff --git a/packages/ui/src/mcp-apps/entries/solidity-stablecoin.ts b/packages/ui/src/mcp-apps/entries/solidity-stablecoin.ts new file mode 100644 index 000000000..143ba5eb5 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/solidity-stablecoin.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { solidityAdapter } from '../solidity/adapter'; + +void mountKindApp(solidityAdapter, 'Stablecoin'); diff --git a/packages/ui/src/mcp-apps/entries/stellar-fungible.ts b/packages/ui/src/mcp-apps/entries/stellar-fungible.ts new file mode 100644 index 000000000..0a3c8a34e --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stellar-fungible.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stellarAdapter } from '../stellar/adapter'; + +void mountKindApp(stellarAdapter, 'Fungible'); diff --git a/packages/ui/src/mcp-apps/entries/stellar-governor.ts b/packages/ui/src/mcp-apps/entries/stellar-governor.ts new file mode 100644 index 000000000..ed2276df0 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stellar-governor.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stellarAdapter } from '../stellar/adapter'; + +void mountKindApp(stellarAdapter, 'Governor'); diff --git a/packages/ui/src/mcp-apps/entries/stellar-non-fungible.ts b/packages/ui/src/mcp-apps/entries/stellar-non-fungible.ts new file mode 100644 index 000000000..211ff2b9f --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stellar-non-fungible.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stellarAdapter } from '../stellar/adapter'; + +void mountKindApp(stellarAdapter, 'NonFungible'); diff --git a/packages/ui/src/mcp-apps/entries/stellar-stablecoin.ts b/packages/ui/src/mcp-apps/entries/stellar-stablecoin.ts new file mode 100644 index 000000000..885178b24 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stellar-stablecoin.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stellarAdapter } from '../stellar/adapter'; + +void mountKindApp(stellarAdapter, 'Stablecoin'); diff --git a/packages/ui/src/mcp-apps/entries/stellar-vault.ts b/packages/ui/src/mcp-apps/entries/stellar-vault.ts new file mode 100644 index 000000000..e36da22ac --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stellar-vault.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stellarAdapter } from '../stellar/adapter'; + +void mountKindApp(stellarAdapter, 'Vault'); diff --git a/packages/ui/src/mcp-apps/entries/stylus-erc1155.ts b/packages/ui/src/mcp-apps/entries/stylus-erc1155.ts new file mode 100644 index 000000000..b6c1fd66d --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stylus-erc1155.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stylusAdapter } from '../stylus/adapter'; + +void mountKindApp(stylusAdapter, 'ERC1155'); diff --git a/packages/ui/src/mcp-apps/entries/stylus-erc20.ts b/packages/ui/src/mcp-apps/entries/stylus-erc20.ts new file mode 100644 index 000000000..3b08a1310 --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stylus-erc20.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stylusAdapter } from '../stylus/adapter'; + +void mountKindApp(stylusAdapter, 'ERC20'); diff --git a/packages/ui/src/mcp-apps/entries/stylus-erc721.ts b/packages/ui/src/mcp-apps/entries/stylus-erc721.ts new file mode 100644 index 000000000..2839885bd --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/stylus-erc721.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { stylusAdapter } from '../stylus/adapter'; + +void mountKindApp(stylusAdapter, 'ERC721'); diff --git a/packages/ui/src/mcp-apps/entries/uniswap-hooks.ts b/packages/ui/src/mcp-apps/entries/uniswap-hooks.ts new file mode 100644 index 000000000..6decc37af --- /dev/null +++ b/packages/ui/src/mcp-apps/entries/uniswap-hooks.ts @@ -0,0 +1,4 @@ +import { mountKindApp } from '../mount'; +import { uniswapHooksAdapter } from '../uniswap-hooks/adapter'; + +void mountKindApp(uniswapHooksAdapter, 'Hooks'); diff --git a/packages/ui/src/mcp-apps/mount.ts b/packages/ui/src/mcp-apps/mount.ts new file mode 100644 index 000000000..e144071fd --- /dev/null +++ b/packages/ui/src/mcp-apps/mount.ts @@ -0,0 +1,62 @@ +import './styles'; +import { App, PostMessageTransport } from '@modelcontextprotocol/ext-apps'; +import type { SvelteComponent } from 'svelte'; +import KindApp from './KindApp.svelte'; +import type { KindAdapter } from './adapter'; +import { readHostSendCaps } from './deliver-contract'; + +/** Stable iframe height for hosts that size from ui/notifications/size-changed. */ +export const MCP_APP_HEIGHT_PX = 560; + +/** + * Mount a fixed-kind Wizard MCP App. + * Component script runs synchronously and registers tool handlers on `mcpApp` + * before we call `connect()`. + * + * autoResize is off: html/body height:100% layouts collapse under the SDK's + * max-content measurement (ext-apps#143 / #619). We report a fixed height instead. + * + * After connect, sets `hostConnected` / `hostSendCaps` / `hostConnectError` on the + * component so Use-this-contract can wait for a live host and check capabilities. + */ +export async function mountKindApp( + adapter: Adapter, + // Adapters are declared with `satisfies KindAdapter`, so their `controls` keys stay literal and + // a kind this language does not have is a compile error rather than a blank controls pane. + kind: Extract, + target: HTMLElement = document.body, +): Promise<{ app: App; component: SvelteComponent }> { + const app = new App({ name: `OpenZeppelin ${kind}`, version: '1.0.0' }, {}, { autoResize: false }); + + // Single source of truth for the height we also report to the host below. + document.documentElement.style.setProperty('--mcp-app-height', `${MCP_APP_HEIGHT_PX}px`); + + const component = new KindApp({ + target, + props: { adapter, kind, mcpApp: app }, + }); + + const transport = new PostMessageTransport(window.parent, window.parent); + void app + .connect(transport) + .then(async () => { + const hostSendCaps = readHostSendCaps(app); + console.info(`[mcp-apps] connected (${kind}) hostCapabilities`, app.getHostCapabilities()); + component.$set({ + hostConnected: true, + hostConnectError: undefined, + hostSendCaps, + }); + await app.sendSizeChanged({ height: MCP_APP_HEIGHT_PX }); + }) + .catch((err: unknown) => { + const message = err instanceof Error ? err.message : String(err); + console.error(`[mcp-apps] connect failed for ${kind}`, err); + component.$set({ + hostConnected: false, + hostConnectError: message, + }); + }); + + return { app, component }; +} diff --git a/packages/ui/src/mcp-apps/opts-snapshot.ts b/packages/ui/src/mcp-apps/opts-snapshot.ts new file mode 100644 index 000000000..003a9fbac --- /dev/null +++ b/packages/ui/src/mcp-apps/opts-snapshot.ts @@ -0,0 +1,28 @@ +/** Deep-clone options for an immutable mount snapshot. */ +export function cloneOpts(value: T): T { + return structuredClone(value); +} + +export function optsEqual(a: unknown, b: unknown): boolean { + return JSON.stringify(a) === JSON.stringify(b); +} + +/** + * Capture / refresh the "original" options from the opening tool run. + * First host apply wins; a later toolresult may replace the snapshot only while + * the UI is still at that original (no user drift yet). + */ +export function nextInitialOpts( + initial: unknown | undefined, + previousOpts: unknown | undefined, + nextOpts: unknown, + source: 'input' | 'result', +): unknown { + if (initial == null) { + return cloneOpts(nextOpts); + } + if (source === 'result' && (previousOpts == null || optsEqual(previousOpts, initial))) { + return cloneOpts(nextOpts); + } + return initial; +} diff --git a/packages/ui/src/mcp-apps/solidity/adapter.ts b/packages/ui/src/mcp-apps/solidity/adapter.ts new file mode 100644 index 000000000..532a060d2 --- /dev/null +++ b/packages/ui/src/mcp-apps/solidity/adapter.ts @@ -0,0 +1,40 @@ +import type { ComponentType } from 'svelte'; + +import type { KindedOptions, Kind } from '@openzeppelin/wizard'; +import { ContractBuilder, buildGeneric, printContract, OptionsError } from '@openzeppelin/wizard'; + +import hljs from '../../solidity/highlightjs'; +import { injectHyperlinks } from '../../solidity/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import ERC20Controls from '../../solidity/ERC20Controls.svelte'; +import ERC721Controls from '../../solidity/ERC721Controls.svelte'; +import ERC1155Controls from '../../solidity/ERC1155Controls.svelte'; +import StablecoinControls from '../../solidity/StablecoinControls.svelte'; +import RealWorldAssetControls from '../../solidity/RealWorldAssetControls.svelte'; +import AccountControls from '../../solidity/AccountControls.svelte'; +import GovernorControls from '../../solidity/GovernorControls.svelte'; +import CustomControls from '../../solidity/CustomControls.svelte'; + +const controls: Record = { + ERC20: ERC20Controls, + ERC721: ERC721Controls, + ERC1155: ERC1155Controls, + Stablecoin: StablecoinControls, + RealWorldAsset: RealWorldAssetControls, + Account: AccountControls, + Governor: GovernorControls, + Custom: CustomControls, +}; + +export const solidityAdapter = { + emptyContract: () => new ContractBuilder('MyToken'), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('solidity', code).value, + injectHyperlinks, + highlightClass: '-solidity', + fence: 'solidity', + controls, +} satisfies KindAdapter; diff --git a/packages/ui/src/mcp-apps/stellar/adapter.ts b/packages/ui/src/mcp-apps/stellar/adapter.ts new file mode 100644 index 000000000..91318bcf1 --- /dev/null +++ b/packages/ui/src/mcp-apps/stellar/adapter.ts @@ -0,0 +1,34 @@ +import type { ComponentType } from 'svelte'; + +import type { KindedOptions, Kind } from '@openzeppelin/wizard-stellar'; +import { ContractBuilder, buildGeneric, printContract, OptionsError } from '@openzeppelin/wizard-stellar'; + +import hljs from '../../stellar/highlightjs'; +import { injectHyperlinks } from '../../stellar/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import FungibleControls from '../../stellar/FungibleControls.svelte'; +import NonFungibleControls from '../../stellar/NonFungibleControls.svelte'; +import StablecoinControls from '../../stellar/StablecoinControls.svelte'; +import GovernorControls from '../../stellar/GovernorControls.svelte'; +import VaultControls from '../../stellar/VaultControls.svelte'; + +const controls: Record = { + Fungible: FungibleControls, + NonFungible: NonFungibleControls, + Stablecoin: StablecoinControls, + Governor: GovernorControls, + Vault: VaultControls, +}; + +export const stellarAdapter = { + emptyContract: () => new ContractBuilder('MyToken'), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('rust', code).value, + injectHyperlinks, + highlightClass: '-stellar', + fence: 'rust', + controls, +} satisfies KindAdapter; diff --git a/packages/ui/src/mcp-apps/styles.ts b/packages/ui/src/mcp-apps/styles.ts new file mode 100644 index 000000000..e7e777d72 --- /dev/null +++ b/packages/ui/src/mcp-apps/styles.ts @@ -0,0 +1 @@ +import '../common/styles/global.css'; diff --git a/packages/ui/src/mcp-apps/stylus/adapter.ts b/packages/ui/src/mcp-apps/stylus/adapter.ts new file mode 100644 index 000000000..225fe0d83 --- /dev/null +++ b/packages/ui/src/mcp-apps/stylus/adapter.ts @@ -0,0 +1,30 @@ +import type { ComponentType } from 'svelte'; + +import type { KindedOptions, Kind } from '@openzeppelin/wizard-stylus'; +import { ContractBuilder, buildGeneric, printContract, OptionsError } from '@openzeppelin/wizard-stylus'; + +import hljs from '../../stylus/highlightjs'; +import { injectHyperlinks } from '../../stylus/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import ERC20Controls from '../../stylus/ERC20Controls.svelte'; +import ERC721Controls from '../../stylus/ERC721Controls.svelte'; +import ERC1155Controls from '../../stylus/ERC1155Controls.svelte'; + +const controls: Record = { + ERC20: ERC20Controls, + ERC721: ERC721Controls, + ERC1155: ERC1155Controls, +}; + +export const stylusAdapter = { + emptyContract: () => new ContractBuilder('MyToken'), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('rust', code).value, + injectHyperlinks, + highlightClass: '-stylus', + fence: 'rust', + controls, +} satisfies KindAdapter; diff --git a/packages/ui/src/mcp-apps/uniswap-hooks/adapter.ts b/packages/ui/src/mcp-apps/uniswap-hooks/adapter.ts new file mode 100644 index 000000000..6f43a72b8 --- /dev/null +++ b/packages/ui/src/mcp-apps/uniswap-hooks/adapter.ts @@ -0,0 +1,27 @@ +import type { ComponentType } from 'svelte'; + +import { ContractBuilder, OptionsError } from '@openzeppelin/wizard'; +import type { KindedOptions, Kind } from '@openzeppelin/wizard-uniswap-hooks'; +import { buildGeneric, printContract } from '@openzeppelin/wizard-uniswap-hooks'; + +import hljs from '../../solidity/highlightjs'; +import { injectHyperlinks } from '../../uniswap-hooks/inject-hyperlinks'; +import type { KindAdapter } from '../adapter'; + +import HooksControls from '../../uniswap-hooks/HooksControls.svelte'; + +const controls: Record = { + Hooks: HooksControls, +}; + +export const uniswapHooksAdapter = { + emptyContract: () => new ContractBuilder('MyHook'), + build: opts => buildGeneric(opts as KindedOptions[Kind]), + print: contract => printContract(contract as Parameters[0]), + optionsErrors: e => (e instanceof OptionsError ? e.messages : undefined), + highlight: code => hljs.highlight('solidity', code).value, + injectHyperlinks, + highlightClass: '-solidity', + fence: 'solidity', + controls, +} satisfies KindAdapter; diff --git a/yarn.lock b/yarn.lock index da155accb..7233f0a25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -677,6 +677,13 @@ semver "^7.5.3" tar "^7.4.0" +"@modelcontextprotocol/ext-apps@1.7.5": + version "1.7.5" + resolved "https://registry.yarnpkg.com/@modelcontextprotocol/ext-apps/-/ext-apps-1.7.5.tgz#53004fadf7bef79c533e28b10893199c7bf46693" + integrity sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg== + dependencies: + "@standard-schema/spec" "^1.1.0" + "@modelcontextprotocol/sdk@^1.29.0": version "1.29.0" resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz#79786d8b525e269de850ac82b1f1f757f3915f44" @@ -712,6 +719,13 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + "@noble/curves@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.0.tgz#13e0ca8be4a0ce66c113693a94514e5599f40cfc" @@ -733,11 +747,21 @@ dependencies: "@noble/hashes" "1.8.0" +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + "@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": version "1.7.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" @@ -748,6 +772,16 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== +"@noble/secp256k1@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@noble/secp256k1@~1.7.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" + integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1109,11 +1143,34 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz#5b2dd648a960b8fa00d76f2cc4eea2f03daa80f4" integrity sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w== +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + "@scure/base@~1.2.5": version "1.2.6" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip32@1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.7.0.tgz#b8683bab172369f988f1589640e53c4606984219" @@ -1123,6 +1180,22 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + "@scure/bip39@1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.6.0.tgz#475970ace440d7be87a6086cbee77cb8f1a684f9" @@ -1204,6 +1277,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== +"@standard-schema/spec@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" + integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -2869,7 +2947,27 @@ etag@^1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -ethereum-cryptography@^1.0.3, ethereum-cryptography@^2.2.1, ethereum-cryptography@^3.2.0: +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethereum-cryptography@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz#42a04b57834bf536e552b50a70b9ee5057c71dc6" integrity sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg== From 89e9fabcd6e76128e2935f43a5f8c00ad8ed6e1a Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Fri, 31 Jul 2026 14:08:36 -0400 Subject: [PATCH 2/4] Add cross-chain options for ERC721, ERC1155, and Governor (Contracts 5.7) (#825) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Claude Co-authored-by: Ernesto García --- .changeset/solidity-57-crosschain.md | 13 + packages/cli/src/cli.test.ts.md | 5 + packages/cli/src/cli.test.ts.snap | Bin 10249 -> 10464 bytes .../common/src/ai/descriptions/solidity.ts | 15 +- packages/common/src/ai/schemas/solidity.ts | 5 + .../core/confidential/src/erc7984.test.ts.md | 20 +- .../confidential/src/erc7984.test.ts.snap | Bin 1699 -> 1699 bytes .../src/get-versioned-remappings.test.ts.md | 2 +- .../src/get-versioned-remappings.test.ts.snap | Bin 309 -> 309 bytes .../confidential/src/zip-hardhat.test.ts.md | 14 +- .../confidential/src/zip-hardhat.test.ts.snap | Bin 1904 -> 1893 bytes packages/core/solidity/package.json | 4 +- packages/core/solidity/src/account.test.ts.md | 660 +++++++++--------- .../core/solidity/src/account.test.ts.snap | Bin 13460 -> 13450 bytes packages/core/solidity/src/account.ts | 4 +- packages/core/solidity/src/custom.test.ts.md | 14 +- .../core/solidity/src/custom.test.ts.snap | Bin 855 -> 854 bytes .../environments/hardhat/package-lock.json | 8 +- .../src/environments/hardhat/package.json | 2 +- .../hardhat/upgradeable/package-lock.json | 18 +- .../hardhat/upgradeable/package.json | 4 +- packages/core/solidity/src/erc1155.test.ts | 49 ++ packages/core/solidity/src/erc1155.test.ts.md | 331 ++++++++- .../core/solidity/src/erc1155.test.ts.snap | Bin 1797 -> 2358 bytes packages/core/solidity/src/erc1155.ts | 51 +- packages/core/solidity/src/erc20.test.ts.md | 102 +-- packages/core/solidity/src/erc20.test.ts.snap | Bin 4398 -> 4403 bytes packages/core/solidity/src/erc20.ts | 29 +- packages/core/solidity/src/erc721.test.ts | 51 ++ packages/core/solidity/src/erc721.test.ts.md | 364 +++++++++- .../core/solidity/src/erc721.test.ts.snap | Bin 2958 -> 3671 bytes packages/core/solidity/src/erc721.ts | 45 +- .../core/solidity/src/generate/erc1155.ts | 26 +- packages/core/solidity/src/generate/erc20.ts | 21 +- packages/core/solidity/src/generate/erc721.ts | 28 +- .../core/solidity/src/generate/governor.ts | 15 + .../src/get-versioned-remappings.test.ts.md | 10 +- .../src/get-versioned-remappings.test.ts.snap | Bin 302 -> 302 bytes packages/core/solidity/src/governor.test.ts | 20 + .../core/solidity/src/governor.test.ts.md | 361 +++++++++- .../core/solidity/src/governor.test.ts.snap | Bin 2360 -> 2709 bytes packages/core/solidity/src/governor.ts | 15 + .../solidity/src/set-crosschain-linked.ts | 37 + .../core/solidity/src/stablecoin.test.ts.md | 44 +- .../core/solidity/src/stablecoin.test.ts.snap | Bin 2180 -> 2181 bytes packages/core/solidity/src/utils/version.ts | 2 +- .../core/solidity/src/zip-foundry.test.ts | 24 + .../core/solidity/src/zip-foundry.test.ts.md | 411 ++++++++++- .../solidity/src/zip-foundry.test.ts.snap | Bin 5186 -> 6145 bytes packages/core/solidity/src/zip-foundry.ts | 129 ++-- .../src/zip-hardhat-polkadot.test.ts.md | 4 +- .../src/zip-hardhat-polkadot.test.ts.snap | Bin 2400 -> 2400 bytes .../core/solidity/src/zip-hardhat.test.ts | 24 + .../core/solidity/src/zip-hardhat.test.ts.md | 311 ++++++++- .../solidity/src/zip-hardhat.test.ts.snap | Bin 3968 -> 4808 bytes packages/core/solidity/src/zip-hardhat.ts | 95 +-- packages/core/solidity/src/zip-shared.ts | 38 + .../src/get-versioned-remappings.test.ts.md | 2 +- .../src/get-versioned-remappings.test.ts.snap | Bin 269 -> 269 bytes .../core/uniswap-hooks/src/hooks.test.ts.md | 372 +++++----- .../core/uniswap-hooks/src/hooks.test.ts.snap | Bin 20506 -> 20507 bytes .../mcp/src/solidity/tools/erc1155.test.ts | 2 + packages/mcp/src/solidity/tools/erc1155.ts | 17 +- .../mcp/src/solidity/tools/erc721.test.ts | 2 + packages/mcp/src/solidity/tools/erc721.ts | 4 + .../mcp/src/solidity/tools/governor.test.ts | 1 + packages/mcp/src/solidity/tools/governor.ts | 2 + .../function-definitions/solidity.ts | 34 + .../ui/src/solidity/ERC1155Controls.svelte | 31 + packages/ui/src/solidity/ERC20Controls.svelte | 5 +- .../ui/src/solidity/ERC721Controls.svelte | 60 +- .../ui/src/solidity/GovernorControls.svelte | 8 + .../crosschain-incremental-tooltip.ts | 8 + packages/ui/src/solidity/inject-hyperlinks.ts | 6 +- .../ui/src/solidity/manual-notice-tooltip.ts | 16 + .../ui/src/solidity/superchain-tooltip.ts | 14 +- yarn.lock | 113 +-- 77 files changed, 3129 insertions(+), 993 deletions(-) create mode 100644 .changeset/solidity-57-crosschain.md create mode 100644 packages/core/solidity/src/set-crosschain-linked.ts create mode 100644 packages/core/solidity/src/zip-shared.ts create mode 100644 packages/ui/src/solidity/crosschain-incremental-tooltip.ts create mode 100644 packages/ui/src/solidity/manual-notice-tooltip.ts diff --git a/.changeset/solidity-57-crosschain.md b/.changeset/solidity-57-crosschain.md new file mode 100644 index 000000000..88f215dc5 --- /dev/null +++ b/.changeset/solidity-57-crosschain.md @@ -0,0 +1,13 @@ +--- +'@openzeppelin/wizard': patch +'@openzeppelin/wizard-common': patch +'@openzeppelin/contracts-mcp': patch +'@openzeppelin/contracts-cli': patch +--- + +Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. +- ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. +- Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. +- Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. +- Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. +- **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. diff --git a/packages/cli/src/cli.test.ts.md b/packages/cli/src/cli.test.ts.md index c07e35189..0b67d12f7 100644 --- a/packages/cli/src/cli.test.ts.md +++ b/packages/cli/src/cli.test.ts.md @@ -81,6 +81,8 @@ Generated by [AVA](https://avajs.dev). --mintable Whether privileged accounts will be able to create more supply or emit more tokens␊ --incremental Whether new tokens will be automatically assigned an incremental id␊ --votes Whether to keep track of individual units for voting in on-chain governance. Voting durations can be expressed as block numbers or timestamps (defaulting to block number if not specified).␊ + --crossChainBridging Whether to embed an ERC-7786 based bridge directly in the token contract, making it natively crosschain. Cross-chain transfers with registered counterparts burn the token on the source chain and mint it on the destination chain. If also using incremental token ids, mint only on a single chain and link counterparts without minting, otherwise colliding ids can strand bridged tokens.␊ + --crossChainLinkAllowOverride Whether to allow replacing a crosschain link that has already been registered. Only used if crossChainBridging is set to "erc7786native".␊ --access The type of access control to provision. Ownable is a simple mechanism with a single account authorized for all privileged actions. Roles is a flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. Managed enables a central contract to define a policy that allows certain callers to access certain functions.␊ --upgradeable Whether the smart contract is upgradeable. Transparent uses more complex proxy with higher overhead, requires less changes in your contract. Can also be used with beacons. UUPS uses simpler proxy with less overhead, requires including extra code in your contract. Allows flexibility for authorizing upgrades.␊ --info.securityContact Email where people can contact you to report security issues. Will only be visible if contract source code is verified.␊ @@ -104,6 +106,8 @@ Generated by [AVA](https://avajs.dev). --mintable Whether privileged accounts will be able to create more supply or emit more tokens␊ --supply Whether to keep track of total supply of tokens␊ --updatableUri Whether privileged accounts will be able to set a new URI for all token types␊ + --crossChainBridging Whether to embed an ERC-7786 based bridge directly in the token contract, making it natively crosschain. Cross-chain transfers with registered counterparts burn the tokens on the source chain and mint them on the destination chain.␊ + --crossChainLinkAllowOverride Whether to allow replacing a crosschain link that has already been registered. Only used if crossChainBridging is set to "erc7786native".␊ --access The type of access control to provision. Ownable is a simple mechanism with a single account authorized for all privileged actions. Roles is a flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. Managed enables a central contract to define a policy that allows certain callers to access certain functions.␊ --upgradeable Whether the smart contract is upgradeable. Transparent uses more complex proxy with higher overhead, requires less changes in your contract. Can also be used with beacons. UUPS uses simpler proxy with less overhead, requires including extra code in your contract. Allows flexibility for authorizing upgrades.␊ --info.securityContact Email where people can contact you to report security issues. Will only be visible if contract source code is verified.␊ @@ -223,6 +227,7 @@ Generated by [AVA](https://avajs.dev). --quorumAbsolute The absolute quorum required, in cases of quorumMode equals absolute␊ --storage Enable storage of proposal details and enumerability of proposals␊ --settings Allow governance to update voting settings (delay, period, proposal threshold)␊ + --crossChainExecution Whether passed proposals can relay execution to other chains through ERC-7786 gateways. Requires a CrosschainRemoteExecutor contract, controlled by this governor, deployed on each target chain. The gateway and executor are chosen per proposal as arguments to the relayCrosschain function.␊ --upgradeable Whether the smart contract is upgradeable. Transparent uses more complex proxy with higher overhead, requires less changes in your contract. Can also be used with beacons. UUPS uses simpler proxy with less overhead, requires including extra code in your contract. Allows flexibility for authorizing upgrades.␊ --info.securityContact Email where people can contact you to report security issues. Will only be visible if contract source code is verified.␊ --info.license The license used by the contract, default is "MIT"␊ diff --git a/packages/cli/src/cli.test.ts.snap b/packages/cli/src/cli.test.ts.snap index aef69e1a978d519e14c850047986f2d51df82f4b..d947d2712d89f6036e3301411c203b2ce121c1b8 100644 GIT binary patch literal 10464 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 Kmlsfw5dQ~+7@{fw diff --git a/packages/common/src/ai/descriptions/solidity.ts b/packages/common/src/ai/descriptions/solidity.ts index 44308014e..19504ad32 100644 --- a/packages/common/src/ai/descriptions/solidity.ts +++ b/packages/common/src/ai/descriptions/solidity.ts @@ -13,6 +13,10 @@ export const solidityPrompts = { Custom: 'Make a custom smart contract.', }; +// Shared by every token kind that supports ERC-7786 native bridging. +const crossChainLinkAllowOverrideDescription = + 'Whether to allow replacing a crosschain link that has already been registered. Only used if crossChainBridging is set to "erc7786native".'; + export const solidityCommonDescriptions = { access: 'The type of access control to provision. Ownable is a simple mechanism with a single account authorized for all privileged actions. Roles is a flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. Managed enables a central contract to define a policy that allows certain callers to access certain functions.', @@ -33,8 +37,7 @@ export const solidityERC20Descriptions = { "Whether to include built-in flash loans to allow lending tokens without requiring collateral as long as they're returned in the same transaction.", crossChainBridging: 'Whether to allow authorized bridge contracts to mint and burn tokens for cross-chain transfers. Options are to use custom bridges on any chain, to embed an ERC-7786 based bridge directly in the token contract, or to use the SuperchainERC20 standard with the predeployed SuperchainTokenBridge. The SuperchainERC20 feature is only available on chains in the Superchain, and requires deploying your contract to the same address on every chain in the Superchain.', - crossChainLinkAllowOverride: - 'Whether to allow replacing a crosschain link that has already been registered. Only used if crossChainBridging is set to "erc7786native".', + crossChainLinkAllowOverride: crossChainLinkAllowOverrideDescription, premintChainId: 'The chain ID of the network on which to premint tokens.', callback: 'Whether to include support for code execution after transfers and approvals on recipient contracts in a single transaction.', @@ -48,12 +51,18 @@ export const solidityERC721Descriptions = { incremental: 'Whether new tokens will be automatically assigned an incremental id', votes: 'Whether to keep track of individual units for voting in on-chain governance. Voting durations can be expressed as block numbers or timestamps (defaulting to block number if not specified).', + crossChainBridging: + 'Whether to embed an ERC-7786 based bridge directly in the token contract, making it natively crosschain. Cross-chain transfers with registered counterparts burn the token on the source chain and mint it on the destination chain. If also using incremental token ids, mint only on a single chain and link counterparts without minting, otherwise colliding ids can strand bridged tokens.', + crossChainLinkAllowOverride: crossChainLinkAllowOverrideDescription, }; export const solidityERC1155Descriptions = { uri: 'The location of the metadata for the token. Clients will replace any instance of {id} in this string with the tokenId.', supply: 'Whether to keep track of total supply of tokens', updatableUri: 'Whether privileged accounts will be able to set a new URI for all token types', + crossChainBridging: + 'Whether to embed an ERC-7786 based bridge directly in the token contract, making it natively crosschain. Cross-chain transfers with registered counterparts burn the tokens on the source chain and mint them on the destination chain.', + crossChainLinkAllowOverride: crossChainLinkAllowOverrideDescription, }; export const solidityStablecoinDescriptions = { @@ -99,4 +108,6 @@ export const solidityGovernorDescriptions = { timelock: 'The type of timelock to use', storage: 'Enable storage of proposal details and enumerability of proposals', settings: 'Allow governance to update voting settings (delay, period, proposal threshold)', + crossChainExecution: + 'Whether passed proposals can relay execution to other chains through ERC-7786 gateways. Requires a CrosschainRemoteExecutor contract, controlled by this governor, deployed on each target chain. The gateway and executor are chosen per proposal as arguments to the relayCrosschain function.', }; diff --git a/packages/common/src/ai/schemas/solidity.ts b/packages/common/src/ai/schemas/solidity.ts index 31571be0d..5bfd98b76 100644 --- a/packages/common/src/ai/schemas/solidity.ts +++ b/packages/common/src/ai/schemas/solidity.ts @@ -67,6 +67,8 @@ export const solidityERC721Schema = { mintable: z.boolean().optional().describe(commonDescriptions.mintable), incremental: z.boolean().optional().describe(solidityERC721Descriptions.incremental), votes: z.literal('blocknumber').or(z.literal('timestamp')).optional().describe(solidityERC721Descriptions.votes), + crossChainBridging: z.literal('erc7786native').optional().describe(solidityERC721Descriptions.crossChainBridging), + crossChainLinkAllowOverride: z.boolean().optional().describe(solidityERC721Descriptions.crossChainLinkAllowOverride), ...solidityCommonSchema, namespacePrefix: z.string().optional().describe(solidityCommonDescriptions.namespacePrefix), } as const satisfies z.ZodRawShape; @@ -79,6 +81,8 @@ export const solidityERC1155Schema = { mintable: z.boolean().optional().describe(commonDescriptions.mintable), supply: z.boolean().optional().describe(solidityERC1155Descriptions.supply), updatableUri: z.boolean().optional().describe(solidityERC1155Descriptions.updatableUri), + crossChainBridging: z.literal('erc7786native').optional().describe(solidityERC1155Descriptions.crossChainBridging), + crossChainLinkAllowOverride: z.boolean().optional().describe(solidityERC1155Descriptions.crossChainLinkAllowOverride), ...solidityCommonSchema, } as const satisfies z.ZodRawShape; @@ -157,6 +161,7 @@ export const solidityGovernorSchema = { quorumAbsolute: z.string().optional().describe(solidityGovernorDescriptions.quorumAbsolute), storage: z.boolean().optional().describe(solidityGovernorDescriptions.storage), settings: z.boolean().optional().describe(solidityGovernorDescriptions.settings), + crossChainExecution: z.boolean().optional().describe(solidityGovernorDescriptions.crossChainExecution), upgradeable: solidityCommonSchema.upgradeable, info: solidityCommonSchema.info, } as const satisfies z.ZodRawShape; diff --git a/packages/core/confidential/src/erc7984.test.ts.md b/packages/core/confidential/src/erc7984.test.ts.md index 111f8d5e1..3fb3b43a8 100644 --- a/packages/core/confidential/src/erc7984.test.ts.md +++ b/packages/core/confidential/src/erc7984.test.ts.md @@ -43,7 +43,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -120,7 +120,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -146,7 +146,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -168,7 +168,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -190,7 +190,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -212,7 +212,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -253,7 +253,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -316,7 +316,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -388,7 +388,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ @@ -463,7 +463,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Confidential Contracts ^0.3.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Confidential Contracts ^0.3.1␊ pragma solidity ^0.8.27;␊ ␊ import {ZamaEthereumConfig} from "@fhevm/solidity/config/ZamaConfig.sol";␊ diff --git a/packages/core/confidential/src/erc7984.test.ts.snap b/packages/core/confidential/src/erc7984.test.ts.snap index 728e52980928f2d269443e4d86ff35f5a1919931..b6266de4be2ac1b38a6d95d1a87cc05612701c46 100644 GIT binary patch delta 1248 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 K!KdZvLjV9HA7y(0 diff --git a/packages/core/confidential/src/get-versioned-remappings.test.ts.md b/packages/core/confidential/src/get-versioned-remappings.test.ts.md index 96d73bc6e..9a60a3248 100644 --- a/packages/core/confidential/src/get-versioned-remappings.test.ts.md +++ b/packages/core/confidential/src/get-versioned-remappings.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - '@openzeppelin/contracts/=@openzeppelin/contracts@5.6.0/', + '@openzeppelin/contracts/=@openzeppelin/contracts@5.7.0/', '@openzeppelin/confidential-contracts/=@openzeppelin/confidential-contracts@0.3.1/', '@fhevm/solidity/=@fhevm/solidity@0.9.1/', ] diff --git a/packages/core/confidential/src/get-versioned-remappings.test.ts.snap b/packages/core/confidential/src/get-versioned-remappings.test.ts.snap index f335d715b369a2bd72a8063b3c946098eafe1572..43f2b01708363d548900f4e18d2327b873a1a667 100644 GIT binary patch literal 309 zcmV-50m}YCRzVG^s=X-**;$E0s*CA~Mih(1USQ9Hl(L|O$E?tV7t=2NhJ3Q*c5Sqa~+&Kq;D*$)} zfOh~GGOu|-*y0qz6#0S{n|JveOOV1$#(dEyuHo~+?QIZi>U6pQH}LUkb~ zqAb305Zj=eAO7y0lmAkGaaE-_6Q^B8udO()>Lop`is-D-CasI%oC`7>B% Hj{yJx;vtM1 literal 309 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 diff --git a/packages/core/solidity/package.json b/packages/core/solidity/package.json index 1655d4ad9..a6d524a93 100644 --- a/packages/core/solidity/package.json +++ b/packages/core/solidity/package.json @@ -28,8 +28,8 @@ }, "devDependencies": { "@openzeppelin/community-contracts": "git+https://github.com/OpenZeppelin/openzeppelin-community-contracts.git#b0ddd27", - "@openzeppelin/contracts": "^5.6.0", - "@openzeppelin/contracts-upgradeable": "^5.6.0", + "@openzeppelin/contracts": "^5.7.0", + "@openzeppelin/contracts-upgradeable": "^5.7.0", "@types/node": "^20.0.0", "@types/semver": "^7.5.7", "ava": "^6.0.0", diff --git a/packages/core/solidity/src/account.test.ts.md b/packages/core/solidity/src/account.test.ts.md index e6a91f134..a31aa7b6a 100644 --- a/packages/core/solidity/src/account.test.ts.md +++ b/packages/core/solidity/src/account.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -36,7 +36,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -69,7 +69,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -96,7 +96,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -124,7 +124,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -152,7 +152,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -181,7 +181,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -218,12 +218,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ ␊ @@ -264,13 +264,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ ␊ contract MyAccount is Account, IERC1271, AccountERC7579 {␊ constructor(uint256 moduleTypeId, address module, bytes calldata initData) {␊ @@ -304,12 +304,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ ␊ @@ -350,13 +350,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ ␊ @@ -397,7 +397,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -435,7 +435,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -481,7 +481,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -519,7 +519,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -558,7 +558,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -597,7 +597,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -637,7 +637,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -685,12 +685,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -747,13 +747,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ ␊ @@ -805,12 +805,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -867,13 +867,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -930,7 +930,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -961,7 +961,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1000,7 +1000,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1031,7 +1031,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1063,7 +1063,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1095,7 +1095,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1128,7 +1128,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1169,12 +1169,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ @@ -1224,13 +1224,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ ␊ contract MyAccount is Initializable, Account, IERC1271, AccountERC7579Upgradeable {␊ @@ -1275,12 +1275,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ @@ -1330,13 +1330,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {ERC7739} from "@openzeppelin/contracts/utils/cryptography/signers/draft-ERC7739.sol";␊ @@ -1386,7 +1386,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1407,7 +1407,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1433,7 +1433,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1454,7 +1454,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1476,7 +1476,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1498,7 +1498,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1521,7 +1521,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1549,12 +1549,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerECDSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerECDSA.sol";␊ @@ -1605,13 +1605,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerECDSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerECDSA.sol";␊ ␊ @@ -1657,12 +1657,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerECDSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerECDSA.sol";␊ @@ -1713,13 +1713,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerECDSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerECDSA.sol";␊ @@ -1770,7 +1770,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1803,7 +1803,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1844,7 +1844,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1877,7 +1877,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1911,7 +1911,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1945,7 +1945,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1982,7 +1982,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2025,13 +2025,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -2097,14 +2097,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -2165,13 +2165,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -2237,14 +2237,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -2310,7 +2310,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2336,7 +2336,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2370,7 +2370,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2396,7 +2396,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2423,7 +2423,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2450,7 +2450,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2480,7 +2480,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -2516,13 +2516,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -2581,14 +2581,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -2642,13 +2642,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -2707,14 +2707,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -2773,7 +2773,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2791,7 +2791,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2815,7 +2815,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2833,7 +2833,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2852,7 +2852,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2871,7 +2871,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2893,7 +2893,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -2921,12 +2921,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerEIP7702} from "@openzeppelin/contracts/utils/cryptography/signers/SignerEIP7702.sol";␊ @@ -2977,13 +2977,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerEIP7702} from "@openzeppelin/contracts/utils/cryptography/signers/SignerEIP7702.sol";␊ ␊ @@ -3027,12 +3027,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerEIP7702} from "@openzeppelin/contracts/utils/cryptography/signers/SignerEIP7702.sol";␊ @@ -3083,13 +3083,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerEIP7702} from "@openzeppelin/contracts/utils/cryptography/signers/SignerEIP7702.sol";␊ @@ -3140,7 +3140,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3173,7 +3173,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3213,7 +3213,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3246,7 +3246,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3280,7 +3280,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3314,7 +3314,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3349,7 +3349,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -3392,12 +3392,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -3463,13 +3463,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ ␊ @@ -3529,12 +3529,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -3600,13 +3600,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -3672,7 +3672,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3720,7 +3720,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3776,7 +3776,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3824,7 +3824,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3873,7 +3873,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3922,7 +3922,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -3974,7 +3974,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4032,13 +4032,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -4119,14 +4119,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -4202,13 +4202,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -4289,14 +4289,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -4377,7 +4377,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4418,7 +4418,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4467,7 +4467,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4508,7 +4508,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4550,7 +4550,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4592,7 +4592,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4637,7 +4637,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ @@ -4688,13 +4688,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -4768,14 +4768,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -4844,13 +4844,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -4924,14 +4924,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -5005,7 +5005,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5045,7 +5045,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5092,7 +5092,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5132,7 +5132,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5173,7 +5173,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5214,7 +5214,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5256,7 +5256,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -5306,12 +5306,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -5385,13 +5385,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ import {MultiSignerERC7913Weighted} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913Weighted.sol";␊ @@ -5459,12 +5459,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -5538,13 +5538,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {MultiSignerERC7913} from "@openzeppelin/contracts/utils/cryptography/signers/MultiSignerERC7913.sol";␊ @@ -5618,7 +5618,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5673,7 +5673,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5736,7 +5736,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5793,7 +5793,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5851,7 +5851,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5909,7 +5909,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -5968,7 +5968,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6033,14 +6033,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -6128,7 +6128,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ @@ -6136,7 +6136,7 @@ Generated by [AVA](https://avajs.dev). import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -6219,14 +6219,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -6314,7 +6314,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ @@ -6322,7 +6322,7 @@ Generated by [AVA](https://avajs.dev). import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -6410,7 +6410,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6458,7 +6458,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6514,7 +6514,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6564,7 +6564,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6615,7 +6615,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6666,7 +6666,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6718,7 +6718,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ @@ -6776,14 +6776,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -6864,7 +6864,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ @@ -6872,7 +6872,7 @@ Generated by [AVA](https://avajs.dev). import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -6948,14 +6948,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -7036,7 +7036,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ @@ -7044,7 +7044,7 @@ Generated by [AVA](https://avajs.dev). import {MultiSignerERC7913Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913Upgradeable.sol";␊ import {MultiSignerERC7913WeightedUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/MultiSignerERC7913WeightedUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -7125,7 +7125,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7146,7 +7146,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7172,7 +7172,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7193,7 +7193,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7215,7 +7215,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7237,7 +7237,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7260,7 +7260,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -7291,12 +7291,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -7350,13 +7350,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ ␊ @@ -7402,12 +7402,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -7461,13 +7461,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -7521,7 +7521,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7554,7 +7554,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7595,7 +7595,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7628,7 +7628,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7662,7 +7662,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7696,7 +7696,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7733,7 +7733,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -7776,13 +7776,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -7848,14 +7848,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -7916,13 +7916,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -7988,14 +7988,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -8061,7 +8061,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8087,7 +8087,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8121,7 +8121,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8147,7 +8147,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8174,7 +8174,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8201,7 +8201,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8231,7 +8231,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -8267,13 +8267,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -8332,14 +8332,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -8393,13 +8393,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -8458,14 +8458,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -8524,7 +8524,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8545,7 +8545,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8571,7 +8571,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8592,7 +8592,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8614,7 +8614,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8636,7 +8636,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8659,7 +8659,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -8690,12 +8690,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerRSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol";␊ @@ -8749,13 +8749,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerRSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol";␊ ␊ @@ -8801,12 +8801,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerRSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol";␊ @@ -8860,13 +8860,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerRSA} from "@openzeppelin/contracts/utils/cryptography/signers/SignerRSA.sol";␊ @@ -8920,7 +8920,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -8953,7 +8953,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -8994,7 +8994,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9027,7 +9027,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9061,7 +9061,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9095,7 +9095,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9132,7 +9132,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9175,13 +9175,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -9247,14 +9247,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -9315,13 +9315,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -9387,14 +9387,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -9460,7 +9460,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9486,7 +9486,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9520,7 +9520,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9546,7 +9546,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9573,7 +9573,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9600,7 +9600,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9630,7 +9630,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ @@ -9666,13 +9666,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -9731,14 +9731,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -9792,13 +9792,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -9857,14 +9857,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerRSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerRSAUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -9923,7 +9923,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -9957,7 +9957,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -9996,7 +9996,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -10030,7 +10030,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -10065,7 +10065,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -10100,7 +10100,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -10136,7 +10136,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -10180,12 +10180,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -10240,13 +10240,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ import {SignerWebAuthn} from "@openzeppelin/contracts/utils/cryptography/signers/SignerWebAuthn.sol";␊ @@ -10293,12 +10293,12 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -10353,13 +10353,13 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {AccountERC7579} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579.sol";␊ import {AccountERC7579Hooked} from "@openzeppelin/contracts/account/extensions/draft-AccountERC7579Hooked.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ import {SignerP256} from "@openzeppelin/contracts/utils/cryptography/signers/SignerP256.sol";␊ @@ -10414,7 +10414,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10461,7 +10461,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10516,7 +10516,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10563,7 +10563,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10611,7 +10611,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10659,7 +10659,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10710,7 +10710,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -10767,14 +10767,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -10841,7 +10841,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ @@ -10849,7 +10849,7 @@ Generated by [AVA](https://avajs.dev). import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -10911,14 +10911,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -10985,7 +10985,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ @@ -10993,7 +10993,7 @@ Generated by [AVA](https://avajs.dev). import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ @@ -11060,7 +11060,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11100,7 +11100,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11148,7 +11148,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11188,7 +11188,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11229,7 +11229,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11270,7 +11270,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11314,7 +11314,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ @@ -11364,14 +11364,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -11431,7 +11431,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ @@ -11439,7 +11439,7 @@ Generated by [AVA](https://avajs.dev). import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ ␊ @@ -11494,14 +11494,14 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579Upgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579Upgradeable.sol";␊ import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ @@ -11561,7 +11561,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccountERC7579HookedUpgradeable} from "@openzeppelin/contracts-upgradeable/account/extensions/draft-AccountERC7579HookedUpgradeable.sol";␊ @@ -11569,7 +11569,7 @@ Generated by [AVA](https://avajs.dev). import {SignerP256Upgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerP256Upgradeable.sol";␊ import {SignerWebAuthnUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerWebAuthnUpgradeable.sol";␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ - import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/draft-IERC4337.sol";␊ + import {PackedUserOperation} from "@openzeppelin/contracts/interfaces/IERC4337.sol";␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ import {AbstractSigner} from "@openzeppelin/contracts/utils/cryptography/signers/AbstractSigner.sol";␊ diff --git a/packages/core/solidity/src/account.test.ts.snap b/packages/core/solidity/src/account.test.ts.snap index 7371e57818b01ca2bfe2b246ecd88652e5e3f035..e6e7ac9698302349d457b1540305909f5fc88df1 100644 GIT binary patch literal 13450 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 YAU%X7;6DlySzq4SL+f?=C}6<;A5FXVb^rhX literal 13460 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 NV~m}`JQW1c{|CvK(Zm1% diff --git a/packages/core/solidity/src/account.ts b/packages/core/solidity/src/account.ts index 95d191b6c..5e44d9fe6 100644 --- a/packages/core/solidity/src/account.ts +++ b/packages/core/solidity/src/account.ts @@ -67,7 +67,7 @@ export function buildAccount(opts: AccountOptions): Contract { if (opts.ERC7579Modules) { c.addImportOnly({ name: 'PackedUserOperation', - path: '@openzeppelin/contracts/interfaces/draft-IERC4337.sol', + path: '@openzeppelin/contracts/interfaces/IERC4337.sol', transpiled: false, // PackedUserOperation doesn't start with "I" so its not recognized as an "interface object" }); } @@ -247,7 +247,7 @@ function overrideRawSignatureValidation(c: ContractBuilder, opts: AccountOptions const signerBaseName = signers[opts.signer].name; const signerName = opts.upgradeable ? upgradeableName(signerBaseName) : signerBaseName; - // WebAuthnSigner depends inherits from P256Signer, so the AbstractSigner override is handled by `addSigner` + // WebAuthnSigner inherits from P256Signer, so the AbstractSigner override is handled by `addSigner` if (opts.signer !== 'WebAuthn') { c.addImportOnly({ name: 'AbstractSigner', diff --git a/packages/core/solidity/src/custom.test.ts.md b/packages/core/solidity/src/custom.test.ts.md index 0219cca07..68a324b07 100644 --- a/packages/core/solidity/src/custom.test.ts.md +++ b/packages/core/solidity/src/custom.test.ts.md @@ -33,7 +33,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -57,7 +57,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ @@ -75,7 +75,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -117,7 +117,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -132,7 +132,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -149,7 +149,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -164,7 +164,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ diff --git a/packages/core/solidity/src/custom.test.ts.snap b/packages/core/solidity/src/custom.test.ts.snap index e2a61edf53d857a6e0fe68eefd6196919e0d8945..433a4d0ea62d19b5d6e41c66f14d2b1042f845b4 100644 GIT binary patch literal 854 zcmV-c1F8H$RzVYg|>r0vvh3(?G6o! ztt4WyBqX_M5_;Hm|3&xD?LXLg*p^+(ahnv%!k|7G`Th9xeeXTL+d-dl@4Nc>3u~e& z9(bYBJRpi8p+;P*AGf}bG&)D?Yp>R#r}A>`b>-A`;q>_6ynaMH%oMJ-e9SZ%5G;40 z-8yp|A<-~Epg1Ky(G$4bYJ6;L@9a5_$C;MM)6kymr>`^T#xV%4-zE@%p#TF>5HjL% zAA>>zJddkq;rjX%xXMtC1PT@E(|H6Jl|Ok1FMd}RVQ^j8=Yc?)^eKih(Ie;x%)VhE zFeNO@ui)}SW2dq80A>;hE;Y z#<98Kq9CCrRJp0O2~w&mQIMK#f=LQ92LQn1OlcW^}&ZrwL~e>4K{@5MiGZ4>+Tf*wo~So}RJUi%*IHLbgnZ%qk6%RmM0JLy3GG zUrtNJlt3~Pe7;adR-s(1qEK21n`F9-(n9jLuadB488=I!2rT_8+7cdtTE z=Yka4`$?5ggLb>er_1BE!WLW~Q&QP5$@yhBSJA1B>%;uf}XU5H)oi%WJ=8C=O zyFCQU^Yu`uM_iI=%1V}&;c+Vv6bG1T6xr6YG=ym^8KT(%zrs=yAKx9M(=a}nU6NMIX92mE?E@71cz{Bxn|?r;H9dwBF@3@*t{xnIZg!8(dd-7&>r3yXb9A_A zyUqQ}ilrSOhK420c2Q|rO6;yqiFN{UNhOjCN!RjSN)cnbxagb7gw&Io?OC1wo^OHc gdU20PSXy@eJuey0OUCn(@yI3PFR6a{fte5h0Gj@w2mk;8 literal 855 zcmV-d1E~B#RzVS7c9-2%9NXm3YyU<1=lTzNE|OM?R(4_sLQNq$iPe0(eQ#zoH~k*v{&)5B7uG~m z-1j4;c}NsPLJhfAKW>5mX>^9x*Iul}Pv!aA%gTxC!pYJ8S^bdsm?>QM0?ah&6D)V2 z<()c?kZ2GhP@Iy0=rLSuH9j`BKkPb=&zY9U*U%d8Wv^4`+A#>OUZ)U%p%4R65HaHO z0E0q(Jd3Mq;rjX*xaOf63KS{Sqq7LkD}Ra*p8c*Y!r;2F$3uZM=}`=S zU`kk?U%|z@#{0(BJ(x)-xYRIhk5~-u8v2rluiGs{*6HHQ=IsgDZXG+V+*IZUn5J;>P5JogXv^`>2)-wC5 zeLB5%690b0d`&omSQlKafrxsP_`n$*C#EJ({B(`YZgNr%5V2)Ke$})QWNhB&n)A5teF>G@>X?6bUt}$@;dX$=mhSHE-t@>;hrxg?p8H zx)7w)-jAw$7PQkjI$0jK6}II1kdn%WNx^>;N&)|U-Pv=6*HCOD$ z-|ZndKVKI`ddMZ2WUSyC_$8K-1o-wKn}*5Bv^e!tZ;X@EJ5NahjT{p8>{VK{cr#5yV~T@ezG~GxSc#YNvtC!`+NY|rZK_hJiN h)ysQC%F?p)?`g?+S~8xNj0Y|me*qf9F`StY003g8sonqp diff --git a/packages/core/solidity/src/environments/hardhat/package-lock.json b/packages/core/solidity/src/environments/hardhat/package-lock.json index 265ee6d8f..22dc3cd9c 100644 --- a/packages/core/solidity/src/environments/hardhat/package-lock.json +++ b/packages/core/solidity/src/environments/hardhat/package-lock.json @@ -12,7 +12,7 @@ "@nomicfoundation/hardhat-ethers": "^4.0.2", "@nomicfoundation/hardhat-ignition": "^3.0.0", "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0", - "@openzeppelin/contracts": "^5.6.0", + "@openzeppelin/contracts": "^5.7.0", "ava": "^6.0.0", "ethers": "^6.8.1", "hardhat": "^3.6.0", @@ -1387,9 +1387,9 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", - "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-IL2AZpI+7THMzt1u6Cxmc1zLwVnudtUGvrqXQ/HnbLKfQ/8dIWMMQPDwPIjRQzNrlAo4cxZaCGRB/XvwPo9ILA==", "dev": true, "license": "MIT" }, diff --git a/packages/core/solidity/src/environments/hardhat/package.json b/packages/core/solidity/src/environments/hardhat/package.json index fe1acb428..0a857a560 100644 --- a/packages/core/solidity/src/environments/hardhat/package.json +++ b/packages/core/solidity/src/environments/hardhat/package.json @@ -14,7 +14,7 @@ "@nomicfoundation/hardhat-ethers": "^4.0.2", "@nomicfoundation/hardhat-ignition": "^3.0.0", "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0", - "@openzeppelin/contracts": "^5.6.0", + "@openzeppelin/contracts": "^5.7.0", "ava": "^6.0.0", "ethers": "^6.8.1", "hardhat": "^3.6.0", diff --git a/packages/core/solidity/src/environments/hardhat/upgradeable/package-lock.json b/packages/core/solidity/src/environments/hardhat/upgradeable/package-lock.json index c1433e45f..e0020af20 100644 --- a/packages/core/solidity/src/environments/hardhat/upgradeable/package-lock.json +++ b/packages/core/solidity/src/environments/hardhat/upgradeable/package-lock.json @@ -10,8 +10,8 @@ "license": "ISC", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^4.0.2", - "@openzeppelin/contracts": "^5.6.0", - "@openzeppelin/contracts-upgradeable": "^5.6.0", + "@openzeppelin/contracts": "^5.7.0", + "@openzeppelin/contracts-upgradeable": "^5.7.0", "@openzeppelin/hardhat-upgrades": "^4.0.2", "ava": "^6.0.0", "ethers": "^6.8.1", @@ -1274,20 +1274,20 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", - "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-IL2AZpI+7THMzt1u6Cxmc1zLwVnudtUGvrqXQ/HnbLKfQ/8dIWMMQPDwPIjRQzNrlAo4cxZaCGRB/XvwPo9ILA==", "dev": true, "license": "MIT" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.6.1.tgz", - "integrity": "sha512-n4a/vfRs114lXyUdYg7pyY8LvFKWvCDF5lEcRRAVxap8g6ZEdLqm+9tmt2zTtRHcNMxTYp9y5t6KBof4tHp7Og==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.7.0.tgz", + "integrity": "sha512-dHA/P3AFsnNXcv82Kge/v35kK0ByNe1EFv4vvOnl//lc8svwRcj5i/bdXd5mdMolD4rjSKy6EWOwc6+7h1gjaQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@openzeppelin/contracts": "5.6.1" + "@openzeppelin/contracts": "5.7.0" } }, "node_modules/@openzeppelin/defender-sdk-base-client": { diff --git a/packages/core/solidity/src/environments/hardhat/upgradeable/package.json b/packages/core/solidity/src/environments/hardhat/upgradeable/package.json index e02ab8c83..7cc23c612 100644 --- a/packages/core/solidity/src/environments/hardhat/upgradeable/package.json +++ b/packages/core/solidity/src/environments/hardhat/upgradeable/package.json @@ -12,8 +12,8 @@ "license": "ISC", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^4.0.2", - "@openzeppelin/contracts": "^5.6.0", - "@openzeppelin/contracts-upgradeable": "^5.6.0", + "@openzeppelin/contracts": "^5.7.0", + "@openzeppelin/contracts-upgradeable": "^5.7.0", "@openzeppelin/hardhat-upgrades": "^4.0.2", "ava": "^6.0.0", "ethers": "^6.8.1", diff --git a/packages/core/solidity/src/erc1155.test.ts b/packages/core/solidity/src/erc1155.test.ts index 5c818868b..dc4d91014 100644 --- a/packages/core/solidity/src/erc1155.test.ts +++ b/packages/core/solidity/src/erc1155.test.ts @@ -100,6 +100,48 @@ testERC1155('full upgradeable transparent with managed', { upgradeable: 'uups', }); +testERC1155('erc1155 crossChainBridging erc7786native', { + crossChainBridging: 'erc7786native', +}); + +testERC1155('erc1155 crossChainBridging erc7786native allowOverride', { + crossChainBridging: 'erc7786native', + crossChainLinkAllowOverride: true, +}); + +testERC1155('erc1155 crossChainBridging erc7786native ownable', { + crossChainBridging: 'erc7786native', + access: 'ownable', +}); + +testERC1155('erc1155 crossChainBridging erc7786native ownable mintable burnable', { + crossChainBridging: 'erc7786native', + access: 'ownable', + mintable: true, + burnable: true, +}); + +testERC1155('erc1155 crossChainBridging erc7786native roles', { + crossChainBridging: 'erc7786native', + access: 'roles', +}); + +testERC1155('erc1155 crossChainBridging erc7786native managed', { + crossChainBridging: 'erc7786native', + access: 'managed', +}); + +testERC1155('erc1155 crossChainBridging erc7786native pausable supply', { + crossChainBridging: 'erc7786native', + pausable: true, + supply: true, +}); + +testERC1155('erc1155 crossChainBridging erc7786native upgradeable', { + crossChainBridging: 'erc7786native', + upgradeable: 'transparent', +}); + testAPIEquivalence('API default'); testAPIEquivalence('API basic', { @@ -133,5 +175,12 @@ test('API isAccessControlRequired', async t => { ); t.is(erc1155.isAccessControlRequired({ updatableUri: true }), true); t.is(erc1155.isAccessControlRequired({ updatableUri: false }), false); + t.is( + erc1155.isAccessControlRequired({ + updatableUri: false, + crossChainBridging: 'erc7786native', + }), + true, + ); t.is(erc1155.isAccessControlRequired({}), true); // updatableUri is true by default }); diff --git a/packages/core/solidity/src/erc1155.test.ts.md b/packages/core/solidity/src/erc1155.test.ts.md index ea07f9400..5cba933bc 100644 --- a/packages/core/solidity/src/erc1155.test.ts.md +++ b/packages/core/solidity/src/erc1155.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -32,7 +32,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -55,7 +55,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -92,7 +92,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -115,7 +115,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -132,7 +132,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -156,7 +156,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -197,7 +197,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -234,7 +234,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -287,7 +287,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -324,7 +324,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -357,7 +357,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -441,7 +441,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -534,7 +534,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ @@ -599,3 +599,306 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## erc1155 crossChainBridging erc7786native + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native allowOverride + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, true);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native ownable mintable burnable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Burnable} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, Ownable, ERC1155Burnable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + ␊ + function mint(address account, uint256 id, uint256 amount, bytes memory data)␊ + public␊ + onlyOwner␊ + {␊ + _mint(account, id, amount, data);␊ + }␊ + ␊ + function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)␊ + public␊ + onlyOwner␊ + {␊ + _mintBatch(to, ids, amounts, data);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, AccessControl {␊ + bytes32 public constant CROSSCHAIN_LINKER_ROLE = keccak256("CROSSCHAIN_LINKER_ROLE");␊ + bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE");␊ + ␊ + constructor(CrosschainLinked.Link[] memory links, address defaultAdmin, address crosschainLinker)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + {␊ + _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ + _grantRole(CROSSCHAIN_LINKER_ROLE, crosschainLinker);␊ + }␊ + ␊ + function setLink(address gateway, bytes memory counterpart)␊ + public␊ + onlyRole(CROSSCHAIN_LINKER_ROLE)␊ + {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyRole(URI_SETTER_ROLE) {␊ + _setURI(newuri);␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function supportsInterface(bytes4 interfaceId)␊ + public␊ + view␊ + override(ERC1155, AccessControl)␊ + returns (bool)␊ + {␊ + return super.supportsInterface(interfaceId);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, AccessManaged {␊ + constructor(CrosschainLinked.Link[] memory links, address initialAuthority)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + AccessManaged(initialAuthority)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public restricted {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public restricted {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native pausable supply + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ + import {ERC1155Crosschain} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol";␊ + import {ERC1155Pausable} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Pausable.sol";␊ + import {ERC1155Supply} from "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";␊ + ␊ + contract MyToken is ERC1155, ERC1155Crosschain, Ownable, ERC1155Pausable, ERC1155Supply {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC1155("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + ␊ + function pause() public onlyOwner {␊ + _pause();␊ + }␊ + ␊ + function unpause() public onlyOwner {␊ + _unpause();␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address from, address to, uint256[] memory ids, uint256[] memory values)␊ + internal␊ + override(ERC1155, ERC1155Pausable, ERC1155Supply)␊ + {␊ + super._update(from, to, ids, values);␊ + }␊ + }␊ + ` + +## erc1155 crossChainBridging erc7786native upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ + import {CrosschainLinkedUpgradeable} from "@openzeppelin/contracts-upgradeable/crosschain/CrosschainLinkedUpgradeable.sol";␊ + import {ERC1155Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol";␊ + import {ERC1155CrosschainUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155CrosschainUpgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ + ␊ + contract MyToken is Initializable, ERC1155Upgradeable, ERC1155CrosschainUpgradeable, OwnableUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(CrosschainLinkedUpgradeable.Link[] memory links, address initialOwner)␊ + public␊ + initializer␊ + {␊ + __ERC1155_init("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + __ERC1155Crosschain_init();␊ + __CrosschainLinked_init(links);␊ + __Ownable_init(initialOwner);␊ + }␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function setURI(string memory newuri) public onlyOwner {␊ + _setURI(newuri);␊ + }␊ + }␊ + ` diff --git a/packages/core/solidity/src/erc1155.test.ts.snap b/packages/core/solidity/src/erc1155.test.ts.snap index 407c11acb010e9d354cafb8e27318b81dd7f7804..ab459754a593fa460bd0bef8b87a7c55fc16dfc9 100644 GIT binary patch literal 2358 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 literal 1797 zcmV+g2m1IyRzVY00000000B+T3c@$MHFtER;Z>gyz?;1lOr5&6G$PAkm_7ojFQIqf=Us! z#=B#C$nMN`E_IwJLi_>#08ix!@dprp0PzYE@9;Z#L3_XYmN?#|UBB4tnK|do%s1zJ z=ghwDc66#9@gIId0t+3X4&+$HoIsQJso>wg)-)*KSGOK5-FWAQ^|^WH#(THcZYc_A z)OMe(?qd}Zj#jH0A_8|YVh_PVwOLRUutNU;d=L{_$3!fDMx}0ZtDG1a@?E2D*$IVEGX>5jkl{8tm4mgR`S{u9HmUHzj`rF1=I1-#?pKuM zK#6NyF=@i-S;7A9N}>u(3E)Vy>eV6_43i!(kU`lH5HyesuK-habgTkO^r0=oovrn0 zy93>>TXw@);jG{Sj1y=eYsDnND%DT}c2N$u8Q`YoaGL>chV9S52Y^u>@g&fe{*3_b zucZutROm6o`Mg?(LP0L`Vc^)vN8sUbDGZZ`Tj^_rRy% z2&pPOTHkn3T#hv^uWS`Y;#fmnD0NZM3``b?;}Fz(3=&bNIx6n&J+8F&o9)W(LG`I^ zdMRq3hr{!M+}06Wo0Z9+x4#qxH2Vm2sjkz3rN-0F0b~f!SBNpJAr2UNDKSGD=nO%_ z1!p;Kurw`5@hTCBb)kxi_BMY6u=ht*3--d9f&cglqk;e6=`E&%C=kMskc@Cp>`?FT z(^#Wr7GmY3abc?xo`8Cuz<>nykd_j3aKslp&m!nJt8(C&IHfOeCd8D;*lc`)t9)`e zsz}kN42$7{LsG=dV!AQs3Qi1J&8qMxKTUKp2?f%$z-IwSGMohEO)Ub-*3Aq+dCA~O zLCYc?d}u%V9m#CUlHweGjqJnEZ!sf{iQ0D8Y&MbTSRlf!xTM77%#vo6Kx}YMgh#lV zz6m8yhxY9+BhY?wJBPOWZ_Qn^i$dFzb1rCmgL7!7&|P1+1#eUwFUReZE7|_iKO*PX4;HR=_p=r~(F zmwL|e`(3H)K$<-UHDrf>!64x#WY$4WIDmHx5eM*JA?tLo6<9vu@U4a>nVKbrM5Ukc zbLvXNpL2GL6?a89g2!*m$I6^gI&xS)sNC76odRRwGqTs9~;!1w~Q7BUN%ijfeEaLjzxxgu^acg_ai% zN2uh5aoDeG*j`tEj}YUds{YvTGoheim;Kr30!NHv1#%NLx3;^*ZL80v1kq4cqa8t^ zqcYMS!{X>39wPl7^DDT7P*rjl`dU?HQZA0-^IEysJ=9on>333j-RO;~8)e5Krwm;e z;g*Xkkxdn!7f?8p2?i~tnR1hI@4EhTdi7S`WZ#U#)e)oPF?~r z``%EJK6XyEC-us1`i#O&*PiSL&#uWi{RdZs{>M5-a90YpE6)}3T;Xcw3IWfD&b8Tz z7iRo95j3b8rj86m1ho22!Qqo8M~+6cpq}R|dA^dKuN<$8EBQNl#>f`{?lvMx%L_MIAsF7<_) n7}HD_G#gt@mysbw&0p+U2pNsrne)$?-^KVJ1XhD)xJLj0L6&W8 diff --git a/packages/core/solidity/src/erc1155.ts b/packages/core/solidity/src/erc1155.ts index b940417b3..e6af761c3 100644 --- a/packages/core/solidity/src/erc1155.ts +++ b/packages/core/solidity/src/erc1155.ts @@ -10,6 +10,10 @@ import { withCommonDefaults, defaults as commonDefaults } from './common-options import { setUpgradeable } from './set-upgradeable'; import { setInfo } from './set-info'; import { printContract } from './print'; +import { addCrosschainLinked } from './set-crosschain-linked'; + +export const crossChainBridgingOptions = [false, 'erc7786native'] as const; +export type CrossChainBridging = (typeof crossChainBridgingOptions)[number]; export interface ERC1155Options extends CommonOptions { name: string; @@ -19,6 +23,8 @@ export interface ERC1155Options extends CommonOptions { mintable?: boolean; supply?: boolean; updatableUri?: boolean; + crossChainBridging?: CrossChainBridging; + crossChainLinkAllowOverride?: boolean; } export const defaults: Required = { @@ -30,6 +36,8 @@ export const defaults: Required = { mintable: false, supply: false, updatableUri: true, + crossChainBridging: false, + crossChainLinkAllowOverride: false, } as const; function withDefaults(opts: ERC1155Options): Required { @@ -41,6 +49,8 @@ function withDefaults(opts: ERC1155Options): Required { mintable: opts.mintable ?? defaults.mintable, supply: opts.supply ?? defaults.supply, updatableUri: opts.updatableUri ?? defaults.updatableUri, + crossChainBridging: opts.crossChainBridging ?? defaults.crossChainBridging, + crossChainLinkAllowOverride: opts.crossChainLinkAllowOverride ?? defaults.crossChainLinkAllowOverride, }; } @@ -49,7 +59,13 @@ export function printERC1155(opts: ERC1155Options = defaults): string { } export function isAccessControlRequired(opts: Partial): boolean { - return opts.mintable || opts.pausable || opts.updatableUri !== false || opts.upgradeable === 'uups'; + return ( + opts.mintable || + opts.pausable || + opts.updatableUri !== false || + opts.upgradeable === 'uups' || + opts.crossChainBridging === 'erc7786native' + ); } export function buildERC1155(opts: ERC1155Options): Contract { @@ -61,6 +77,10 @@ export function buildERC1155(opts: ERC1155Options): Contract { addBase(c, allOpts.uri); + if (allOpts.crossChainBridging) { + addCrossChainBridging(c, allOpts.crossChainBridging, allOpts.crossChainLinkAllowOverride, access); + } + if (allOpts.updatableUri) { addSetUri(c, access); } @@ -124,6 +144,35 @@ function addMintable(c: ContractBuilder, access: Access) { c.addFunctionCode('_mintBatch(to, ids, amounts, data);', functions.mintBatch); } +function addCrossChainBridging( + c: ContractBuilder, + crossChainBridging: 'erc7786native', + crossChainLinkAllowOverride: boolean, + access: Access, +) { + switch (crossChainBridging) { + case 'erc7786native': + addERC1155Crosschain(c, crossChainLinkAllowOverride, access); + break; + default: { + const _: never = crossChainBridging; + throw new Error('Unknown value for `crossChainBridging`'); + } + } +} + +function addERC1155Crosschain(c: ContractBuilder, crossChainLinkAllowOverride: boolean, access: Access) { + addCrosschainLinked( + c, + { + name: 'ERC1155Crosschain', + path: '@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Crosschain.sol', + }, + crossChainLinkAllowOverride, + access, + ); +} + function addSetUri(c: ContractBuilder, access: Access) { requireAccessControl(c, functions.setURI, access, 'URI_SETTER', undefined); c.addFunctionCode('_setURI(newuri);', functions.setURI); diff --git a/packages/core/solidity/src/erc20.test.ts.md b/packages/core/solidity/src/erc20.test.ts.md index 3f7986cdd..7eeaf20ab 100644 --- a/packages/core/solidity/src/erc20.test.ts.md +++ b/packages/core/solidity/src/erc20.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -25,7 +25,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -41,7 +41,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -58,7 +58,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -97,7 +97,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -140,7 +140,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -179,7 +179,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -219,7 +219,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -240,7 +240,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -256,7 +256,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -276,7 +276,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -292,7 +292,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -317,7 +317,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -337,7 +337,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -358,7 +358,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -379,7 +379,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -400,7 +400,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -425,7 +425,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -454,7 +454,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -471,7 +471,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -487,7 +487,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -523,7 +523,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -550,7 +550,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -586,7 +586,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -631,7 +631,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -648,7 +648,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -685,7 +685,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -722,7 +722,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -764,7 +764,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -806,7 +806,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -836,7 +836,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -864,7 +864,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -892,7 +892,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -920,7 +920,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -953,7 +953,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -988,7 +988,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -1016,7 +1016,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -1032,7 +1032,7 @@ Generated by [AVA](https://avajs.dev). _disableInitializers();␊ }␊ ␊ - function initialize(CrosschainLinked.Link[] memory links, address initialOwner)␊ + function initialize(CrosschainLinkedUpgradeable.Link[] memory links, address initialOwner)␊ public␊ initializer␊ {␊ @@ -1054,7 +1054,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -1083,7 +1083,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1117,7 +1117,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -1163,7 +1163,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -1197,7 +1197,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -1258,7 +1258,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";␊ @@ -1297,7 +1297,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -1318,7 +1318,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1358,7 +1358,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -1394,7 +1394,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -1502,7 +1502,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -1590,7 +1590,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -1687,7 +1687,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ diff --git a/packages/core/solidity/src/erc20.test.ts.snap b/packages/core/solidity/src/erc20.test.ts.snap index aa2e72acb9af85a4267ea02f603a2a6893ef1b7c..6692c9d874c351c3d96eaa905047b908b723f2b2 100644 GIT binary patch literal 4403 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 o>>I~Mvy0d?CS(k;iO { t.is(erc721.isAccessControlRequired({ pausable: true }), true); t.is(erc721.isAccessControlRequired({ upgradeable: 'uups' }), true); t.is(erc721.isAccessControlRequired({ upgradeable: 'transparent' }), false); + t.is(erc721.isAccessControlRequired({ crossChainBridging: 'erc7786native' }), true); + t.is(erc721.isAccessControlRequired({ crossChainBridging: false }), false); }); diff --git a/packages/core/solidity/src/erc721.test.ts.md b/packages/core/solidity/src/erc721.test.ts.md index 9f016cf1c..a9eb3f753 100644 --- a/packages/core/solidity/src/erc721.test.ts.md +++ b/packages/core/solidity/src/erc721.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -39,7 +39,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -58,7 +58,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -100,7 +100,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -136,7 +136,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -184,7 +184,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -237,7 +237,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -253,7 +253,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -290,7 +290,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -328,7 +328,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -351,7 +351,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -387,7 +387,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -410,7 +410,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -437,7 +437,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -471,7 +471,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -505,7 +505,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ @@ -548,7 +548,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -624,7 +624,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -693,7 +693,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -758,7 +758,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -831,7 +831,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -911,7 +911,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ @@ -991,7 +991,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ @@ -1086,7 +1086,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ @@ -1175,3 +1175,317 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## erc721 crossChainBridging erc7786native + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native allowOverride + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, true);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native ownable mintable burnable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Burnable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable, ERC721Burnable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function safeMint(address to, uint256 tokenId) public onlyOwner {␊ + _safeMint(to, tokenId);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native mintable incremental + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + uint256 private _nextTokenId;␊ + ␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function safeMint(address to) public onlyOwner returns (uint256) {␊ + uint256 tokenId = _nextTokenId++;␊ + _safeMint(to, tokenId);␊ + return tokenId;␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, AccessControl {␊ + bytes32 public constant CROSSCHAIN_LINKER_ROLE = keccak256("CROSSCHAIN_LINKER_ROLE");␊ + ␊ + constructor(CrosschainLinked.Link[] memory links, address defaultAdmin, address crosschainLinker)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + {␊ + _grantRole(DEFAULT_ADMIN_ROLE, defaultAdmin);␊ + _grantRole(CROSSCHAIN_LINKER_ROLE, crosschainLinker);␊ + }␊ + ␊ + function setLink(address gateway, bytes memory counterpart)␊ + public␊ + onlyRole(CROSSCHAIN_LINKER_ROLE)␊ + {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function supportsInterface(bytes4 interfaceId)␊ + public␊ + view␊ + override(ERC721, AccessControl)␊ + returns (bool)␊ + {␊ + return super.supportsInterface(interfaceId);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native managed + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, AccessManaged {␊ + constructor(CrosschainLinked.Link[] memory links, address initialAuthority)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + AccessManaged(initialAuthority)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public restricted {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native pausable votes enumerable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + import {ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";␊ + import {ERC721Pausable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol";␊ + import {ERC721Votes} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Votes.sol";␊ + import {EIP712} from "@openzeppelin/contracts/utils/cryptography/EIP712.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable, ERC721Enumerable, ERC721Pausable, EIP712, ERC721Votes {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("MyToken", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + EIP712("MyToken", "1")␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + ␊ + function pause() public onlyOwner {␊ + _pause();␊ + }␊ + ␊ + function unpause() public onlyOwner {␊ + _unpause();␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function _update(address to, uint256 tokenId, address auth)␊ + internal␊ + override(ERC721, ERC721Enumerable, ERC721Pausable, ERC721Votes)␊ + returns (address)␊ + {␊ + return super._update(to, tokenId, auth);␊ + }␊ + ␊ + function _increaseBalance(address account, uint128 value)␊ + internal␊ + override(ERC721, ERC721Enumerable, ERC721Votes)␊ + {␊ + super._increaseBalance(account, value);␊ + }␊ + ␊ + function supportsInterface(bytes4 interfaceId)␊ + public␊ + view␊ + override(ERC721, ERC721Enumerable)␊ + returns (bool)␊ + {␊ + return super.supportsInterface(interfaceId);␊ + }␊ + }␊ + ` + +## erc721 crossChainBridging erc7786native upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ + import {CrosschainLinkedUpgradeable} from "@openzeppelin/contracts-upgradeable/crosschain/CrosschainLinkedUpgradeable.sol";␊ + import {ERC721Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol";␊ + import {ERC721CrosschainUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721CrosschainUpgradeable.sol";␊ + import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ + ␊ + contract MyToken is Initializable, ERC721Upgradeable, ERC721CrosschainUpgradeable, OwnableUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(CrosschainLinkedUpgradeable.Link[] memory links, address initialOwner)␊ + public␊ + initializer␊ + {␊ + __ERC721_init("MyToken", "MTK");␊ + __ERC721Crosschain_init();␊ + __CrosschainLinked_init(links);␊ + __Ownable_init(initialOwner);␊ + }␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + ` diff --git a/packages/core/solidity/src/erc721.test.ts.snap b/packages/core/solidity/src/erc721.test.ts.snap index 902ad59a752bac5011ec80601bcc9a87a2656b00..9668723b546f2bd257d89b888681d3609d9b2de4 100644 GIT binary patch literal 3671 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 E09}K(kN^Mx diff --git a/packages/core/solidity/src/erc721.ts b/packages/core/solidity/src/erc721.ts index dc5258aff..83668a75c 100644 --- a/packages/core/solidity/src/erc721.ts +++ b/packages/core/solidity/src/erc721.ts @@ -14,6 +14,10 @@ import { printContract } from './print'; import type { ClockMode } from './set-clock-mode'; import { clockModeDefault, setClockMode } from './set-clock-mode'; import { setNamespacedStorage, toStorageStructInstantiation } from './set-namespaced-storage'; +import { addCrosschainLinked } from './set-crosschain-linked'; + +export const crossChainBridgingOptions = [false, 'erc7786native'] as const; +export type CrossChainBridging = (typeof crossChainBridgingOptions)[number]; export interface ERC721Options extends CommonOptions { name: string; @@ -30,6 +34,8 @@ export interface ERC721Options extends CommonOptions { * Setting `true` is equivalent to 'blocknumber'. Setting a clock mode implies voting is enabled. */ votes?: boolean | ClockMode; + crossChainBridging?: CrossChainBridging; + crossChainLinkAllowOverride?: boolean; namespacePrefix?: string; } @@ -45,6 +51,8 @@ export const defaults: Required = { mintable: false, incremental: false, votes: false, + crossChainBridging: false, + crossChainLinkAllowOverride: false, namespacePrefix: 'myProject', } as const; @@ -60,6 +68,8 @@ function withDefaults(opts: ERC721Options): Required { mintable: opts.mintable ?? defaults.mintable, incremental: opts.incremental ?? defaults.incremental, votes: opts.votes ?? defaults.votes, + crossChainBridging: opts.crossChainBridging ?? defaults.crossChainBridging, + crossChainLinkAllowOverride: opts.crossChainLinkAllowOverride ?? defaults.crossChainLinkAllowOverride, namespacePrefix: opts.namespacePrefix ?? defaults.namespacePrefix, }; } @@ -69,7 +79,7 @@ export function printERC721(opts: ERC721Options = defaults): string { } export function isAccessControlRequired(opts: Partial): boolean { - return opts.mintable || opts.pausable || opts.upgradeable === 'uups'; + return opts.mintable || opts.pausable || opts.upgradeable === 'uups' || opts.crossChainBridging === 'erc7786native'; } export function buildERC721(opts: ERC721Options): Contract { @@ -85,6 +95,10 @@ export function buildERC721(opts: ERC721Options): Contract { addBaseURI(c, allOpts.baseUri); } + if (allOpts.crossChainBridging) { + addCrossChainBridging(c, allOpts.crossChainBridging, allOpts.crossChainLinkAllowOverride, access); + } + if (allOpts.enumerable) { addEnumerable(c); } @@ -209,6 +223,35 @@ function addMintable( if (incremental) c.addFunctionCode('return tokenId;', fn); } +function addCrossChainBridging( + c: ContractBuilder, + crossChainBridging: 'erc7786native', + crossChainLinkAllowOverride: boolean, + access: Access, +) { + switch (crossChainBridging) { + case 'erc7786native': + addERC721Crosschain(c, crossChainLinkAllowOverride, access); + break; + default: { + const _: never = crossChainBridging; + throw new Error('Unknown value for `crossChainBridging`'); + } + } +} + +function addERC721Crosschain(c: ContractBuilder, crossChainLinkAllowOverride: boolean, access: Access) { + addCrosschainLinked( + c, + { + name: 'ERC721Crosschain', + path: '@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol', + }, + crossChainLinkAllowOverride, + access, + ); +} + function addVotes(c: ContractBuilder, name: string, clockMode: ClockMode) { const EIP712 = { name: 'EIP712', diff --git a/packages/core/solidity/src/generate/erc1155.ts b/packages/core/solidity/src/generate/erc1155.ts index fdb9c09fe..9633c6ae0 100644 --- a/packages/core/solidity/src/generate/erc1155.ts +++ b/packages/core/solidity/src/generate/erc1155.ts @@ -1,4 +1,5 @@ import type { ERC1155Options } from '../erc1155'; +import { crossChainBridgingOptions } from '../erc1155'; import { accessOptions } from '../set-access-control'; import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; @@ -14,11 +15,34 @@ const blueprint = { mintable: booleans, supply: booleans, updatableUri: booleans, + crossChainBridging: crossChainBridgingOptions, + crossChainLinkAllowOverride: [false], access: accessOptions, upgradeable: upgradeableOptions, info: infoOptions, }; +// crossChainBridging x upgradeable is excluded from the exhaustive matrix above to limit its size, +// so cross it against a reduced blueprint to still get compile coverage of the transpiled variants. +const crossChainBridgingUpgradeableBlueprint = { + ...blueprint, + burnable: [false], + pausable: [false], + mintable: [false], + supply: [false], + updatableUri: [false], + crossChainBridging: ['erc7786native'] as const, + upgradeable: ['transparent', 'uups'] as const, + info: [{}], +}; + export function* generateERC1155Options(): Generator> { - yield* generateAlternatives(blueprint); + for (const opts of generateAlternatives(blueprint)) { + // crossChainBridging x upgradeable is covered by the reduced blueprint below + if (!(opts.crossChainBridging && opts.upgradeable)) { + yield opts; + } + } + + yield* generateAlternatives(crossChainBridgingUpgradeableBlueprint); } diff --git a/packages/core/solidity/src/generate/erc20.ts b/packages/core/solidity/src/generate/erc20.ts index f8ccb93c3..06e4e6f2a 100644 --- a/packages/core/solidity/src/generate/erc20.ts +++ b/packages/core/solidity/src/generate/erc20.ts @@ -40,19 +40,36 @@ const basicFeatures = { }, }; +// crossChainBridging x upgradeable is excluded from the exhaustive matrix above to limit its size, +// so cross it against a reduced blueprint to still get compile coverage of the transpiled variants +// (including the ERC-7201 namespaced storage used by 'custom' bridging when upgradeable). +const crossChainBridgingUpgradeableBlueprint = { + ...blueprintWithoutBasicFeatures, + ...basicFeatures.OFF, + decimals: ['18'], + pausable: [false], + mintable: [false], + votes: [false] as const, + crossChainBridging: ['custom', 'erc7786native', 'superchain'] as const, + upgradeable: ['transparent', 'uups'] as const, + info: [{}], +}; + export function* generateERC20Options(): Generator> { // Separate generation steps with basic features OFF and ON to avoid having too many combinations for (const opts of generateAlternatives({ ...blueprintWithoutBasicFeatures, ...basicFeatures.OFF })) { - // crossChainBridging does not currently support upgradeable + // crossChainBridging x upgradeable is covered by the reduced blueprint below if (!(opts.crossChainBridging && opts.upgradeable)) { yield opts; } } for (const opts of generateAlternatives({ ...blueprintWithoutBasicFeatures, ...basicFeatures.ON })) { - // crossChainBridging does not currently support upgradeable + // crossChainBridging x upgradeable is covered by the reduced blueprint below if (!(opts.crossChainBridging && opts.upgradeable)) { yield opts; } } + + yield* generateAlternatives(crossChainBridgingUpgradeableBlueprint); } diff --git a/packages/core/solidity/src/generate/erc721.ts b/packages/core/solidity/src/generate/erc721.ts index 13749101c..3bb1a2f03 100644 --- a/packages/core/solidity/src/generate/erc721.ts +++ b/packages/core/solidity/src/generate/erc721.ts @@ -1,4 +1,5 @@ import type { ERC721Options } from '../erc721'; +import { crossChainBridgingOptions } from '../erc721'; import { accessOptions } from '../set-access-control'; import { clockModeOptions } from '../set-clock-mode'; import { infoOptions } from '../set-info'; @@ -17,6 +18,8 @@ const blueprint = { pausable: booleans, mintable: booleans, incremental: booleans, + crossChainBridging: crossChainBridgingOptions, + crossChainLinkAllowOverride: [false], access: accessOptions, upgradeable: upgradeableOptions, namespacePrefix: ['myProject'], @@ -24,6 +27,29 @@ const blueprint = { votes: [...booleans, ...clockModeOptions] as const, }; +// crossChainBridging x upgradeable is excluded from the exhaustive matrix above to limit its size, +// so cross it against a reduced blueprint to still get compile coverage of the transpiled variants. +const crossChainBridgingUpgradeableBlueprint = { + ...blueprint, + enumerable: [false], + uriStorage: [false], + burnable: [false], + pausable: [false], + mintable: [false], + incremental: [false], + votes: [false] as const, + crossChainBridging: ['erc7786native'] as const, + upgradeable: ['transparent', 'uups'] as const, + info: [{}], +}; + export function* generateERC721Options(): Generator> { - yield* generateAlternatives(blueprint); + for (const opts of generateAlternatives(blueprint)) { + // crossChainBridging x upgradeable is covered by the reduced blueprint below + if (!(opts.crossChainBridging && opts.upgradeable)) { + yield opts; + } + } + + yield* generateAlternatives(crossChainBridgingUpgradeableBlueprint); } diff --git a/packages/core/solidity/src/generate/governor.ts b/packages/core/solidity/src/generate/governor.ts index 765f4e69f..517f51f44 100644 --- a/packages/core/solidity/src/generate/governor.ts +++ b/packages/core/solidity/src/generate/governor.ts @@ -23,11 +23,26 @@ const blueprint = { timelock: timelockOptions, storage: booleans, settings: booleans, + crossChainExecution: [false], upgradeable: upgradeableOptions, access: accessOptions, info: infoOptions, }; +// crossChainExecution adds a single extension with no interactions with other options, +// so cross it against a reduced blueprint to avoid doubling the exhaustive matrix. +const crossChainExecutionBlueprint = { + ...blueprint, + proposalThreshold: ['0'], + quorumMode: ['percent'] as const, + storage: [false], + settings: [true], + crossChainExecution: [true], + access: [false] as const, + info: [{}], +}; + export function* generateGovernorOptions(): Generator> { yield* generateAlternatives(blueprint); + yield* generateAlternatives(crossChainExecutionBlueprint); } diff --git a/packages/core/solidity/src/get-versioned-remappings.test.ts.md b/packages/core/solidity/src/get-versioned-remappings.test.ts.md index 939a6022f..79a33c813 100644 --- a/packages/core/solidity/src/get-versioned-remappings.test.ts.md +++ b/packages/core/solidity/src/get-versioned-remappings.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - '@openzeppelin/contracts/=@openzeppelin/contracts@5.6.0/', + '@openzeppelin/contracts/=@openzeppelin/contracts@5.7.0/', ] ## getVersionedRemappings upgradeable uups @@ -17,8 +17,8 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - '@openzeppelin/contracts/=@openzeppelin/contracts@5.6.0/', - '@openzeppelin/contracts-upgradeable/=@openzeppelin/contracts-upgradeable@5.6.0/', + '@openzeppelin/contracts/=@openzeppelin/contracts@5.7.0/', + '@openzeppelin/contracts-upgradeable/=@openzeppelin/contracts-upgradeable@5.7.0/', ] ## getVersionedRemappings upgradeable transparent @@ -26,6 +26,6 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - '@openzeppelin/contracts/=@openzeppelin/contracts@5.6.0/', - '@openzeppelin/contracts-upgradeable/=@openzeppelin/contracts-upgradeable@5.6.0/', + '@openzeppelin/contracts/=@openzeppelin/contracts@5.7.0/', + '@openzeppelin/contracts-upgradeable/=@openzeppelin/contracts-upgradeable@5.7.0/', ] diff --git a/packages/core/solidity/src/get-versioned-remappings.test.ts.snap b/packages/core/solidity/src/get-versioned-remappings.test.ts.snap index 58b44e8558e875766a596d63891514301ad2da6e..9bd630f9e0aaa25fd03ca21b7d19d4bf0026edb8 100644 GIT binary patch delta 148 zcmV;F0BirQ0j#>0s4oR>scR*2mk;800003<&eQj!%z@K?<7=<2%*#u$jWXsDS~#9Q-CZMOY6jJ z#5rkdlNZ*g=R!k%KJZwcW{Yf|ckHtP_8xcIwk~{!f9t`=a{y%@)}_@7QMp>^<(ZZC&^d|JH+#=KvOw|0f8+x{7iT0{{So CbwcF; diff --git a/packages/core/solidity/src/governor.test.ts b/packages/core/solidity/src/governor.test.ts index 3d7535024..ce5a3dcc7 100644 --- a/packages/core/solidity/src/governor.test.ts +++ b/packages/core/solidity/src/governor.test.ts @@ -142,6 +142,26 @@ testGovernor('governor with erc20votes, upgradable', { upgradeable: 'uups', }); +testGovernor('governor with crossChainExecution', { + crossChainExecution: true, +}); + +testGovernor('governor with crossChainExecution, no timelock', { + crossChainExecution: true, + timelock: false, +}); + +testGovernor('governor with crossChainExecution, storage, settings', { + crossChainExecution: true, + storage: true, + settings: true, +}); + +testGovernor('governor with crossChainExecution, upgradable', { + crossChainExecution: true, + upgradeable: 'uups', +}); + testAPIEquivalence('API default'); testAPIEquivalence('API basic', { diff --git a/packages/core/solidity/src/governor.test.ts.md b/packages/core/solidity/src/governor.test.ts.md index cf4b429de..f2bc837b9 100644 --- a/packages/core/solidity/src/governor.test.ts.md +++ b/packages/core/solidity/src/governor.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -99,7 +99,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -185,7 +185,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -277,7 +277,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -369,7 +369,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -458,7 +458,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -553,7 +553,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -639,7 +639,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -725,7 +725,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -817,7 +817,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -906,7 +906,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -992,7 +992,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1082,7 +1082,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1168,7 +1168,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1254,7 +1254,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1343,7 +1343,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1429,7 +1429,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1518,7 +1518,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ @@ -1604,7 +1604,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {GovernorUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol";␊ @@ -1701,3 +1701,326 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ` + +## governor with crossChainExecution + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + import {GovernorCountingSimple} from "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";␊ + import {GovernorCrosschain} from "@openzeppelin/contracts/governance/extensions/GovernorCrosschain.sol";␊ + import {GovernorTimelockControl} from "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";␊ + import {GovernorVotes} from "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";␊ + import {GovernorVotesQuorumFraction} from "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + ␊ + contract MyGovernor is Governor, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl, GovernorCrosschain {␊ + constructor(IVotes _token, TimelockController _timelock)␊ + Governor("MyGovernor")␊ + GovernorVotes(_token)␊ + GovernorVotesQuorumFraction(4)␊ + GovernorTimelockControl(_timelock)␊ + {}␊ + ␊ + function votingDelay() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + ␊ + function votingPeriod() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function state(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (ProposalState)␊ + {␊ + return super.state(proposalId);␊ + }␊ + ␊ + function proposalNeedsQueuing(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (bool)␊ + {␊ + return super.proposalNeedsQueuing(proposalId);␊ + }␊ + ␊ + function _queueOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint48)␊ + {␊ + return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executeOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + {␊ + super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint256)␊ + {␊ + return super._cancel(targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executor()␊ + internal␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (address)␊ + {␊ + return super._executor();␊ + }␊ + }␊ + ` + +## governor with crossChainExecution, no timelock + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ + import {GovernorCountingSimple} from "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";␊ + import {GovernorCrosschain} from "@openzeppelin/contracts/governance/extensions/GovernorCrosschain.sol";␊ + import {GovernorVotes} from "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";␊ + import {GovernorVotesQuorumFraction} from "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + ␊ + contract MyGovernor is Governor, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorCrosschain {␊ + constructor(IVotes _token)␊ + Governor("MyGovernor")␊ + GovernorVotes(_token)␊ + GovernorVotesQuorumFraction(4)␊ + {}␊ + ␊ + function votingDelay() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + ␊ + function votingPeriod() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + }␊ + ` + +## governor with crossChainExecution, storage, settings + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + import {GovernorCountingSimple} from "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";␊ + import {GovernorCrosschain} from "@openzeppelin/contracts/governance/extensions/GovernorCrosschain.sol";␊ + import {GovernorSettings} from "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";␊ + import {GovernorStorage} from "@openzeppelin/contracts/governance/extensions/GovernorStorage.sol";␊ + import {GovernorTimelockControl} from "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";␊ + import {GovernorVotes} from "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";␊ + import {GovernorVotesQuorumFraction} from "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + ␊ + contract MyGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorStorage, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl, GovernorCrosschain {␊ + constructor(IVotes _token, TimelockController _timelock)␊ + Governor("MyGovernor")␊ + GovernorSettings(50400 /* 1 week */, 50400 /* 1 week */, 0)␊ + GovernorVotes(_token)␊ + GovernorVotesQuorumFraction(4)␊ + GovernorTimelockControl(_timelock)␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function state(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (ProposalState)␊ + {␊ + return super.state(proposalId);␊ + }␊ + ␊ + function proposalNeedsQueuing(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (bool)␊ + {␊ + return super.proposalNeedsQueuing(proposalId);␊ + }␊ + ␊ + function proposalThreshold()␊ + public␊ + view␊ + override(Governor, GovernorSettings)␊ + returns (uint256)␊ + {␊ + return super.proposalThreshold();␊ + }␊ + ␊ + function _propose(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, string memory description, address proposer)␊ + internal␊ + override(Governor, GovernorStorage)␊ + returns (uint256)␊ + {␊ + return super._propose(targets, values, calldatas, description, proposer);␊ + }␊ + ␊ + function _queueOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint48)␊ + {␊ + return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executeOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + {␊ + super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint256)␊ + {␊ + return super._cancel(targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executor()␊ + internal␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (address)␊ + {␊ + return super._executor();␊ + }␊ + }␊ + ` + +## governor with crossChainExecution, upgradable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {GovernorUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol";␊ + import {TimelockControllerUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol";␊ + import {GovernorCountingSimpleUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol";␊ + import {GovernorCrosschainUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCrosschainUpgradeable.sol";␊ + import {GovernorTimelockControlUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol";␊ + import {GovernorVotesQuorumFractionUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol";␊ + import {GovernorVotesUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ + import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";␊ + ␊ + contract MyGovernor is Initializable, GovernorUpgradeable, GovernorCountingSimpleUpgradeable, GovernorVotesUpgradeable, GovernorVotesQuorumFractionUpgradeable, GovernorTimelockControlUpgradeable, GovernorCrosschainUpgradeable, UUPSUpgradeable {␊ + /// @custom:oz-upgrades-unsafe-allow constructor␊ + constructor() {␊ + _disableInitializers();␊ + }␊ + ␊ + function initialize(IVotes _token, TimelockControllerUpgradeable _timelock)␊ + public␊ + initializer␊ + {␊ + __Governor_init("MyGovernor");␊ + __GovernorCountingSimple_init();␊ + __GovernorVotes_init(_token);␊ + __GovernorVotesQuorumFraction_init(4);␊ + __GovernorTimelockControl_init(_timelock);␊ + __GovernorCrosschain_init();␊ + }␊ + ␊ + function votingDelay() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + ␊ + function votingPeriod() public pure override returns (uint256) {␊ + return 50400; // 1 week␊ + }␊ + ␊ + function _authorizeUpgrade(address newImplementation)␊ + internal␊ + override␊ + onlyGovernance␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function state(uint256 proposalId)␊ + public␊ + view␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + returns (ProposalState)␊ + {␊ + return super.state(proposalId);␊ + }␊ + ␊ + function proposalNeedsQueuing(uint256 proposalId)␊ + public␊ + view␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + returns (bool)␊ + {␊ + return super.proposalNeedsQueuing(proposalId);␊ + }␊ + ␊ + function _queueOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + returns (uint48)␊ + {␊ + return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executeOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + {␊ + super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + returns (uint256)␊ + {␊ + return super._cancel(targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executor()␊ + internal␊ + view␊ + override(GovernorUpgradeable, GovernorTimelockControlUpgradeable)␊ + returns (address)␊ + {␊ + return super._executor();␊ + }␊ + }␊ + ` diff --git a/packages/core/solidity/src/governor.test.ts.snap b/packages/core/solidity/src/governor.test.ts.snap index ed75fc0fd421e96034336840a85ff2d01cd7875e..a92d985467aa998fcb542bc1175c23c89fe7334f 100644 GIT binary patch literal 2709 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 PmQDO0SjXXh{vQDVqF4?1 literal 2360 zcmV-83CH$9RzV-m21Nl`L6BPuG|0dS&~>m9SE?lo)*%6Gq!rL4 zPGuK;L9?L9ku)*Mp=XAY)`kxSdhR9X9+Gd7Z;%!}7Y&LY3-r(rQSfDUclfre>c$uGX5iYbp?kQ07JMZg6)XX=!Mf`?q%9#N-)%2V#S zOa^u+Pq~tR{L*!8W&d{l{nu{&@K*fyy&v3q^ZSE!%OZ!5AN^+Im&~Doq#Fk=4HP?O zR6HOb9XwgHEb@^1p{>}FM^inYgf#da4MXa&fIQ@Z61Jlx`D|x%cXO~73j4&jiR2!0 znHrJL2Ag}E+xPd^)|el1p~%ahXI8%=$AbIh&IdfC!HZ0wYW`p)Y6x1O77j+ zA4__|d>V%&F@k#@y^PG_#X0F(=|dg`iUlW!%nvU3Ead2&k0G50)v&VrM%a!KqdHIfMWJYs^n`LKeEdP{>J@K@+(@{a^H7rB<4oCMY(h3Z@^O$+7*ETIkyFN% zce8HrF{Q5jG@=m;POitbBd!lucvNcYOb3V0BO1|9LMrT}ze}9!6WetKmGbw0AU^fE z7!hTQ6RKpNWUVJ>&TKD=XQ!i)qEi<*w&%skfvb$ng~1rl z&b6a4^K)qfkBeT7Kg*k;vW}^DZeo(Q`PG_ckGDGRK5R?E) zSe*oxfD%9nZHZH1FoF`QDB(vYB@F5S;lBnTd<#GTAOH{u03l9pfd@_T0B`^}02}}g z77a4s0B~SB*Ax!UOg4~I#gEt$GFX3Ukb#G-3@s#s!>s$7snSwb9zSl(q9xs~#XApQnL5q^)C!o`P1uQl@_u}+ItOAB^3fvSrt;L;*zYRy9g>B-fz*CstmyC zrh?NjZ9$it)JY}cQIwsS%9X}Rb{0G;7EAQ9>1xpgPdhzlhS#513x)&3f#I%yFoNOc zT#ZJBvpqPAlc18-Xx|zf_cyFYYaz!0vQ`GNz*Jx=FxBca6=(o7ut<pR%F4psmwfE5-EGFSnuU^>^B6$aI;ptrHlf`;{x0S%vHQ+o@c0h`)U zw!o(Ls!ipL;m|;3FY&Mjs*}V5 znCKi#bRQiqpY`uz4HVWu0cJo1AOa8ph@dS*kXr+FoIS2>Zzde9zi+_70Obt80pI{| zum~LN01j%`S3RNu_gP>klX#Qg7$0D16%Ygn0t8t!$UqPvi0NEo1bN3qkm>Y_=!ZUP z6TlDP2k_%+@B{m^QJVl501N;I00V$QYrx=b6AT>ghdc`0Iw<&$0R{i)HWaiVZBHY< zth_yyhQ$36iThZVj-HO@EU{-aaJjJbO=A@VTr(MD_wr0MDA?T|GDz(L8nhY>(oR}U zHmLLsaIj$DKnGV8W#GZ0!?E*xQ0ZM`K-e$=A^Gx=Ao=o=fJlL3rVs8J_pqRgQyXdi^6a&EM9AI=GCpx?mYAY*0 zBs1bw);dzIO0;EQ)#Yjj0H^5D4X<^85V7S-ad9J~DSYV@$Od=-JXkcyzysic z>0Dzxc(?F-dfS7uH0y}M6JfhC5fnk-jlUQm@aH$K5d@wlcGB3;8Tr~qG-+DK2UC(} zqC#`6wKC^|iRL!UWQ^G+<=nUuo2qrpPYhRLSiPP)4qI+#WemEaB!MahAxw_>~UPEkX3KD*|^PYqMSCn1TJ%# z`$V$HJXY^Xx%IwDUntP?qbAiy}wf{Hjm+6Og zq)xeDFZ8XWlNJ)t^Mkl|d>W`EeVro(oE!+eYzV|NmGOR{&18Mao4@ = { quorumAbsolute: '', storage: false, settings: true, + crossChainExecution: false, } as const; export const votesOptions = ['erc20votes', 'erc721votes'] as const; @@ -57,6 +58,7 @@ export interface GovernorOptions extends CommonOptions { timelock?: TimelockOptions; storage?: boolean; settings?: boolean; + crossChainExecution?: boolean; } export function isAccessControlRequired(_: Partial): boolean { @@ -78,6 +80,7 @@ function withDefaults(opts: GovernorOptions): Required { votes: opts.votes ?? defaults.votes, clockMode: opts.clockMode ?? defaults.clockMode, timelock: opts.timelock ?? defaults.timelock, + crossChainExecution: opts.crossChainExecution ?? defaults.crossChainExecution, }; } @@ -95,6 +98,7 @@ export function buildGovernor(opts: GovernorOptions): Contract { addVotes(c); addQuorum(c, allOpts); addTimelock(c, allOpts); + addCrossChainExecution(c, allOpts); setUpgradeableGovernor(c, allOpts.upgradeable); setInfo(c, allOpts.info); @@ -383,6 +387,17 @@ function addTimelock(c: ContractBuilder, { timelock }: Required c.addOverride(timelockParent, functions.proposalNeedsQueuing); } +function addCrossChainExecution(c: ContractBuilder, { crossChainExecution }: Required) { + if (!crossChainExecution) { + return; + } + + c.addParent({ + name: 'GovernorCrosschain', + path: '@openzeppelin/contracts/governance/extensions/GovernorCrosschain.sol', + }); +} + function addStorage(c: ContractBuilder, { storage }: GovernorOptions) { if (storage) { const GovernorStorage = { diff --git a/packages/core/solidity/src/set-crosschain-linked.ts b/packages/core/solidity/src/set-crosschain-linked.ts new file mode 100644 index 000000000..422f5d673 --- /dev/null +++ b/packages/core/solidity/src/set-crosschain-linked.ts @@ -0,0 +1,37 @@ +import type { BaseFunction, ContractBuilder, ImportContract } from './contract'; +import type { Access } from './set-access-control'; +import { requireAccessControl } from './set-access-control'; + +export const setLink: BaseFunction = { + name: 'setLink', + kind: 'public', + args: [ + { name: 'gateway', type: 'address' }, + { name: 'counterpart', type: 'bytes memory' }, + ], +}; + +/** + * Adds a `CrosschainLinked` based bridging extension, along with the `setLink` function used to register + * the counterparts it can bridge with. `parent` is the token-specific extension, e.g. `ERC721Crosschain`. + */ +export function addCrosschainLinked( + c: ContractBuilder, + parent: ImportContract, + crossChainLinkAllowOverride: boolean, + access: Access, +) { + c.addParent(parent); + + c.addConstructionOnly( + { + name: 'CrosschainLinked', + path: '@openzeppelin/contracts/crosschain/CrosschainLinked.sol', + }, + [{ lit: 'links' }], + ); + c.addConstructorArgument({ type: { name: 'CrosschainLinked.Link[] memory' }, name: 'links' }); + + requireAccessControl(c, setLink, access, 'CROSSCHAIN_LINKER', 'crosschainLinker'); + c.addFunctionCode(`_setLink(gateway, counterpart, ${crossChainLinkAllowOverride});`, setLink); +} diff --git a/packages/core/solidity/src/stablecoin.test.ts.md b/packages/core/solidity/src/stablecoin.test.ts.md index 15bcc1513..f9dc949ec 100644 --- a/packages/core/solidity/src/stablecoin.test.ts.md +++ b/packages/core/solidity/src/stablecoin.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -25,7 +25,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -42,7 +42,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -81,7 +81,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -124,7 +124,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -163,7 +163,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -203,7 +203,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -224,7 +224,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -240,7 +240,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -265,7 +265,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -290,7 +290,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -319,7 +319,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -344,7 +344,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -361,7 +361,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -377,7 +377,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Community Contracts commit b0ddd27␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Community Contracts commit b0ddd27␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Freezable} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Freezable.sol";␊ @@ -412,7 +412,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Community Contracts commit b0ddd27␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Community Contracts commit b0ddd27␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Restricted} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Restricted.sol";␊ @@ -455,7 +455,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Community Contracts commit b0ddd27␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Community Contracts commit b0ddd27␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Restricted} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Restricted.sol";␊ @@ -494,7 +494,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -530,7 +530,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -566,7 +566,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -611,7 +611,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -628,7 +628,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and Community Contracts commit b0ddd27␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and Community Contracts commit b0ddd27␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20Freezable} from "@openzeppelin/community-contracts/token/ERC20/extensions/ERC20Freezable.sol";␊ diff --git a/packages/core/solidity/src/stablecoin.test.ts.snap b/packages/core/solidity/src/stablecoin.test.ts.snap index 2ac5475cab03075b913afe03d05286b34cc9b6b3..a27e407e99aa9823f984de89e702a09d9ec7974a 100644 GIT binary patch literal 2181 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 { await runTest(c, t, opts); }); +test.serial('erc721 crossChainBridging erc7786native', async t => { + const opts: GenericOptions = { + kind: 'ERC721', + name: 'My Token', + symbol: 'MTK', + access: 'ownable', + crossChainBridging: 'erc7786native', + }; + const c = buildERC721(opts); + await runTest(c, t, opts); +}); + +test.serial('governor', async t => { + const opts: GenericOptions = { + kind: 'Governor', + name: 'My Governor', + delay: '1 day', + period: '1 week', + }; + const c = buildGovernor(opts); + await runTest(c, t, opts); +}); + test.serial('account ecdsa', async t => { const opts: GenericOptions = { kind: 'Account', name: 'My Account', signer: 'ECDSA' }; const c = buildAccount(opts); diff --git a/packages/core/solidity/src/zip-foundry.test.ts.md b/packages/core/solidity/src/zip-foundry.test.ts.md index 0ec24b8f0..1dc7039e3 100644 --- a/packages/core/solidity/src/zip-foundry.test.ts.md +++ b/packages/core/solidity/src/zip-foundry.test.ts.md @@ -120,7 +120,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -330,7 +330,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -590,7 +590,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";␊ @@ -777,7 +777,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -942,7 +942,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1108,7 +1108,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -1158,6 +1158,393 @@ Generated by [AVA](https://avajs.dev). `, ] +## erc721 crossChainBridging erc7786native + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --quiet␊ + ␊ + # Install OpenZeppelin Contracts␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyToken.s.sol␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/guides/scripting-with-solidity) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + ␊ + contract MyTokenScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + CrosschainLinked.Link[] memory links = ;␊ + address initialOwner = ;␊ + MyToken instance = new MyToken(links, initialOwner);␊ + console.log("Contract deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("My Token", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {MyToken} from "src/MyToken.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + ␊ + contract MyTokenTest is Test {␊ + MyToken public instance;␊ + ␊ + function setUp() public {␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + CrosschainLinked.Link[] memory links = ;␊ + address initialOwner = vm.addr(1);␊ + instance = new MyToken(links, initialOwner);␊ + */␊ + }␊ + ␊ + function testSomething() public {␊ + // Add your test here␊ + }␊ + }␊ + `, + ] + +## governor + +> Snapshot 1 + + [ + `#!/usr/bin/env bash␊ + ␊ + # Check if git is installed␊ + if ! which git &> /dev/null␊ + then␊ + echo "git command not found. Install git and try again."␊ + exit 1␊ + fi␊ + ␊ + # Check if Foundry is installed␊ + if ! which forge &> /dev/null␊ + then␊ + echo "forge command not found. Install Foundry and try again. See https://book.getfoundry.sh/getting-started/installation"␊ + exit 1␊ + fi␊ + ␊ + # Setup Foundry project␊ + if ! [ -f "foundry.toml" ]␊ + then␊ + echo "Initializing Foundry project..."␊ + ␊ + # Backup Wizard template readme to avoid it being overwritten␊ + mv README.md README-oz.md␊ + ␊ + # Initialize sample Foundry project␊ + forge init --force --quiet␊ + ␊ + # Install OpenZeppelin Contracts␊ + forge install OpenZeppelin/openzeppelin-contracts@vX.Y.Z --quiet␊ + ␊ + # Remove unneeded Foundry template files␊ + rm src/Counter.sol␊ + rm script/Counter.s.sol␊ + rm test/Counter.t.sol␊ + rm README.md␊ + ␊ + # Restore Wizard template readme␊ + mv README-oz.md README.md␊ + ␊ + # Add remappings␊ + if [ -f "remappings.txt" ]␊ + then␊ + echo "" >> remappings.txt␊ + fi␊ + echo "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/" >> remappings.txt␊ + ␊ + # Perform initial git commit␊ + git add .␊ + git commit -m "openzeppelin: add wizard output" --quiet␊ + ␊ + echo "Done."␊ + else␊ + echo "Foundry project already initialized."␊ + fi␊ + `, + `# Sample Foundry Project␊ + ␊ + This project demonstrates a basic Foundry use case. It comes with a contract generated by [OpenZeppelin Wizard](https://wizard.openzeppelin.com/), a test for that contract, and a script that deploys that contract.␊ + ␊ + ## Installing Foundry␊ + ␊ + See [Foundry installation guide](https://book.getfoundry.sh/getting-started/installation).␊ + ␊ + ## Initializing the project␊ + ␊ + \`\`\`␊ + bash setup.sh␊ + \`\`\`␊ + ␊ + ## Testing the contract␊ + ␊ + \`\`\`␊ + forge test␊ + \`\`\`␊ + ␊ + ## Deploying the contract␊ + ␊ + You can simulate a deployment by running the script:␊ + ␊ + \`\`\`␊ + forge script script/MyGovernor.s.sol␊ + \`\`\`␊ + ␊ + See [Solidity scripting guide](https://book.getfoundry.sh/guides/scripting-with-solidity) for more information.␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Script} from "forge-std/Script.sol";␊ + import {console} from "forge-std/console.sol";␊ + import {MyGovernor} from "src/MyGovernor.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + ␊ + contract MyGovernorScript is Script {␊ + function setUp() public {}␊ + ␊ + function run() public {␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + vm.startBroadcast();␊ + IVotes _token = ;␊ + TimelockController _timelock = ;␊ + MyGovernor instance = new MyGovernor(_token, _timelock);␊ + console.log("Contract deployed to %s", address(instance));␊ + vm.stopBroadcast();␊ + */␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + import {GovernorCountingSimple} from "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";␊ + import {GovernorSettings} from "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";␊ + import {GovernorTimelockControl} from "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";␊ + import {GovernorVotes} from "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";␊ + import {GovernorVotesQuorumFraction} from "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + ␊ + contract MyGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl {␊ + constructor(IVotes _token, TimelockController _timelock)␊ + Governor("My Governor")␊ + GovernorSettings(7200 /* 1 day */, 50400 /* 1 week */, 0)␊ + GovernorVotes(_token)␊ + GovernorVotesQuorumFraction(4)␊ + GovernorTimelockControl(_timelock)␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function state(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (ProposalState)␊ + {␊ + return super.state(proposalId);␊ + }␊ + ␊ + function proposalNeedsQueuing(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (bool)␊ + {␊ + return super.proposalNeedsQueuing(proposalId);␊ + }␊ + ␊ + function proposalThreshold()␊ + public␊ + view␊ + override(Governor, GovernorSettings)␊ + returns (uint256)␊ + {␊ + return super.proposalThreshold();␊ + }␊ + ␊ + function _queueOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint48)␊ + {␊ + return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executeOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + {␊ + super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint256)␊ + {␊ + return super._cancel(targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executor()␊ + internal␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (address)␊ + {␊ + return super._executor();␊ + }␊ + }␊ + `, + `// SPDX-License-Identifier: MIT␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Test} from "forge-std/Test.sol";␊ + import {MyGovernor} from "src/MyGovernor.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + ␊ + contract MyGovernorTest is Test {␊ + MyGovernor public instance;␊ + ␊ + function setUp() public {␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + IVotes _token = ;␊ + TimelockController _timelock = ;␊ + instance = new MyGovernor(_token, _timelock);␊ + */␊ + }␊ + ␊ + function testSomething() public {␊ + // Add your test here␊ + }␊ + }␊ + `, + ] + ## account ecdsa > Snapshot 1 @@ -1271,7 +1658,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -1436,7 +1823,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -1758,7 +2145,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManagedUpgradeable} from "@openzeppelin/contracts-upgradeable/access/manager/AccessManagedUpgradeable.sol";␊ @@ -1912,7 +2299,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2055,7 +2442,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -2202,7 +2589,7 @@ Generated by [AVA](https://avajs.dev). }␊ `, `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ diff --git a/packages/core/solidity/src/zip-foundry.test.ts.snap b/packages/core/solidity/src/zip-foundry.test.ts.snap index 53c0c35ef43ca6f6dd3f5053dd7c07dbde570433..f9e10cc9b47987059342495f5d0b672a066d2357 100644 GIT binary patch literal 6145 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 T!+UbEi{vRT}{SkiGo< literal 5186 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 diff --git a/packages/core/solidity/src/zip-foundry.ts b/packages/core/solidity/src/zip-foundry.ts index e9446dade..4f632ae8a 100644 --- a/packages/core/solidity/src/zip-foundry.ts +++ b/packages/core/solidity/src/zip-foundry.ts @@ -1,6 +1,6 @@ import JSZip from 'jszip'; import type { GenericOptions } from './build-generic'; -import type { Contract } from './contract'; +import type { Contract, FunctionArgument } from './contract'; import { printContract } from './print'; import SOLIDITY_VERSION from './solidity-version.json'; import contracts from '../openzeppelin-contracts'; @@ -8,6 +8,8 @@ import type { Lines } from './utils/format-lines'; import { formatLinesWithSpaces, spaceBetween } from './utils/format-lines'; import { stringifyUnicodeSafe } from './utils/sanitize'; import type { Upgradeable } from './set-upgradeable'; +import { withHelpers } from './options'; +import { addTodoAndCommentOut, hasNonAddressArgs, isAddressType } from './zip-shared'; function getHeader(c: Contract) { return [`// SPDX-License-Identifier: ${c.license}`, `pragma solidity ^${SOLIDITY_VERSION};`]; @@ -30,9 +32,39 @@ function getImports(c: Contract, prepopulateImports: string[]): string[] { ); } result.push(`import {${c.name}} from "src/${c.name}.sol";`); + result.push(...getConstructorArgTypeImports(c)); return result; } +/** + * Imports needed by the types that non-address constructor arguments are declared with, + * for example `CrosschainLinked` for a `CrosschainLinked.Link[] memory` argument. Without + * these, uncommenting the generated deployment would not compile. + */ +function getConstructorArgTypeImports(c: Contract): string[] { + const { transformImport } = withHelpers(c); + const statements = new Set(); + + for (const arg of c.constructorArgs) { + if (typeof arg.type === 'string') { + continue; // primitive type, nothing to import + } + const baseName = getBaseTypeName(arg.type.name); + const imported = c.imports.find(i => i.name === baseName); + if (imported !== undefined) { + const { name, path } = transformImport(imported); + statements.add(`import {${name}} from "${path}";`); + } + } + + return Array.from(statements).sort(); +} + +// The contract name that a declared type refers to, e.g. `CrosschainLinked.Link[] memory` -> `CrosschainLinked`. +function getBaseTypeName(type: string): string { + return type.split(/[.[\s]/)[0]!; +} + function getDeploymentCode( c: Contract, args: string[], @@ -85,36 +117,26 @@ const test = (c: Contract, opts?: GenericOptions) => { ); function getTestCase(c: Contract) { - const args = getAddressArgs(c); + let i = 1; // private key index starts from 1 since it must be non-zero + const variables = getVariables(c, opts, () => `vm.addr(${i++})`); + const setUpLines = [...variables, ...getDeploymentCode(c, getArgNames(c), false, opts?.upgradeable)]; return [ `contract ${c.name}Test is Test {`, spaceBetween( [`${c.name} public instance;`], - [ - 'function setUp() public {', - getAddressVariables(c, args), - getDeploymentCode(c, args, false, opts?.upgradeable), - '}', - ], + ['function setUp() public {', hasNonAddressArgs(c) ? addTodoAndCommentOut(c, setUpLines) : setUpLines, '}'], getContractSpecificTestFunction(), ), '}', ]; } - function getAddressVariables(c: Contract, args: string[]): Lines[] { - const vars = []; - let i = 1; // private key index starts from 1 since it must be non-zero - if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) { - vars.push(`address initialOwner = vm.addr(${i++});`); - } - for (const arg of args) { - vars.push(`address ${arg} = vm.addr(${i++});`); - } - return vars; - } - function getContractSpecificTestFunction(): Lines[] { + if (hasNonAddressArgs(c)) { + // The deployment in setUp is commented out until the user fills in the missing + // constructor arguments, so there is no `instance` to test against yet. + return ['function testSomething() public {', ['// Add your test here'], '}']; + } if (opts !== undefined) { switch (opts.kind) { case 'ERC20': @@ -145,14 +167,43 @@ const test = (c: Contract, opts?: GenericOptions) => { } }; -function getAddressArgs(c: Contract): string[] { - const args = []; - for (const constructorArg of c.constructorArgs) { - if (constructorArg.type === 'address') { - args.push(constructorArg.name); +function getArgNames(c: Contract): string[] { + return c.constructorArgs.map(arg => arg.name); +} + +/** + * Local variable declarations for the transparent proxy admin owner (when needed) and for each + * constructor argument. `addressValue` renders the initializer for `address` arguments, which + * differs between the test (deterministic `vm.addr`) and the script (a placeholder to fill in). + */ +function getVariables(c: Contract, opts: GenericOptions | undefined, addressValue: (name: string) => string): Lines[] { + const vars = []; + if (needsInitialOwnerVariable(c, opts)) { + vars.push(`address initialOwner = ${addressValue('initialOwner')};`); + } + for (const arg of c.constructorArgs) { + if (isAddressType(arg)) { + vars.push(`address ${arg.name} = ${addressValue(arg.name)};`); + } else { + vars.push(`${getLocalVariableType(c, arg)} ${arg.name} = ;`); } } - return args; + return vars; +} + +// Type to use when declaring a constructor argument as a local variable. +// Uses the same name transformation as the contract itself, so that upgradeable +// contracts refer to the transpiled type (e.g. `CrosschainLinkedUpgradeable.Link[]`). +function getLocalVariableType(c: Contract, arg: FunctionArgument): string { + const type = typeof arg.type === 'string' ? arg.type : withHelpers(c).transformName(arg.type); + return type.replace(/\bcalldata\b/, 'memory'); +} + +// The `initialOwner` for the transparent proxy admin, unless the constructor already has an argument with that name. +function needsInitialOwnerVariable(c: Contract, opts?: GenericOptions): boolean { + return ( + c.upgradeable && opts?.upgradeable === 'transparent' && !c.constructorArgs.some(arg => arg.name === 'initialOwner') + ); } const script = (c: Contract, opts?: GenericOptions) => { @@ -166,10 +217,10 @@ const script = (c: Contract, opts?: GenericOptions) => { ); function getScript(c: Contract) { - const args = getAddressArgs(c); + const args = getArgNames(c); const deploymentLines = [ 'vm.startBroadcast();', - ...getAddressVariables(c, args), + ...getVariables(c, opts, name => ``), ...getDeploymentCode(c, args, true, opts?.upgradeable), `console.log("${c.upgradeable ? 'Proxy' : 'Contract'} deployed to %s", address(instance));`, 'vm.stopBroadcast();', @@ -178,31 +229,11 @@ const script = (c: Contract, opts?: GenericOptions) => { `contract ${c.name}Script is Script {`, spaceBetween( ['function setUp() public {}'], - ['function run() public {', args.length > 0 ? addTodoAndCommentOut(deploymentLines) : deploymentLines, '}'], + ['function run() public {', args.length > 0 ? addTodoAndCommentOut(c, deploymentLines) : deploymentLines, '}'], ), '}', ]; } - - function getAddressVariables(c: Contract, args: string[]): Lines[] { - const vars = []; - if (c.upgradeable && opts?.upgradeable === 'transparent' && !args.includes('initialOwner')) { - vars.push('address initialOwner = ;'); - } - for (const arg of args) { - vars.push(`address ${arg} = ;`); - } - return vars; - } - - function addTodoAndCommentOut(lines: Lines[]) { - return [ - '// TODO: Set addresses for the variables below, then uncomment the following section:', - '/*', - ...lines, - '*/', - ]; - } }; const setupSh = (c: Contract) => `\ diff --git a/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.md b/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.md index cca6743d4..acf0f6e92 100644 --- a/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.md +++ b/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.md @@ -11,7 +11,7 @@ Generated by [AVA](https://avajs.dev). [ `contracts/MyToken.sol:␊ // SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -213,7 +213,7 @@ Generated by [AVA](https://avajs.dev). [ `contracts/MyToken.sol:␊ // SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ diff --git a/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.snap b/packages/core/solidity/src/zip-hardhat-polkadot.test.ts.snap index 994b53faf5c4a470b7d8696aaf293f7135ec95c7..a602558b53ac9bda8130ca32fc782edcb73405d6 100644 GIT binary patch delta 1436 zcmV;N1!MZ)65tXtK~_N^Q*L2!b7*gLAa*kf0|1fa*DX`5I?@A>v;!p&!tp)gt)eM! z7AYq5*{T(rcjJ*VB?eNe3Zh7KkzH;9+mXy90fmwAHh=%I`4#n%No?)}$P^t?6kXWe z>Ff0^9>qk_qY&YQsxdr{k^Kqd7(>cnD}#j>tKOQ|c4I+C5dq0V8c;Qb7j5q|ud}x9 zx-^QpP;j>C`zWPhN*dvcwR#W_Yyb)%6^&x4+eCUxuT!$t^=_ z|1JXgGJg?_9EJEUV0fyKNy?dQ&0s9Te-IKm-la^vkANIxk%T>x$oI7%!&r!qBBJl5 zzC~Ds{gf+|?*nZB=8zw8=3kDQC>qL^rA-0cY!%Y;0#t$#(}0_7gh2ODsVzE6%jtM_Zw z(n7Vq{zi=5ok#tJ7^MY`VL%L*NPNXbjRb)}DM6r5V~R{QAe#zsNRm)(1`%b&Y)le~ zq8LY%DHL@BtbdH@wd(E^jBBe6sP6XvP@N;NPAiew^|PF6pmA#@tvc;?8}7kM8}8kM z02_T8kxd5E>`-h<62U-bu@+oQh%0Rb|Tzymh|HjI<`18gmodZo}# z&wfc65z{@Q#$8z6d34a*?+^Ai`ws{G$AkUe)19Zi!FKQI;L+pllad4{8@2|U+nam+ z-v09C@-o++ue&aunz%`md>R|;lhg!ZJjNJVfXt^@f__aAq?uo=daGVLjrrFfFHPC@ zI^J4NdD)rO9QVDI0y`xz3mvc1@!G~Z_dMH->)B>JsFQI8EDPgvIMW$iUtN#4ACssB zAORbb$psz(ca!J^MSuB#Xg5w_1IP)XD%Haqp_-#8#LpD7MfnOFP@Bg%pd*Gt7mLr@ z&%N{xUN3Q%U4IF{%0d9UTbHnQ7P8t6zJ&GD5^ITgQ+%0uajx5UiTFD@Y{rh724%(Yp(EjWCes6Po zx93Gc*S!k|CJAS^JM0Pm5`E>m{V|mg+Ytm9nPW&4N+57VB=vKaL?ZY^q6a%VCL@&g zm4oB~3L|8wnN7|4Z07mnYx;_a;CXGVR4lu#)`=N=RFZ$aNnd+ zlh6yL1MW*NyP=HFWkiH(7EOMDlV(YhY=zt>VN*|Qi(7S2To-y)H?yd#3JiIy=}n1b z_DWzJ65qPke2sY+pvZFn;hRgRLxV9-G*{RhYO4<~RMv-f%loO{(i_IuSGZhzHTSnY zkr#=-;eQGEgn=SrgbE0oX62+!>r*L$>*9OyM}tN0#Yx3+c5XP%KW{qDKW;e= qU2>eSKYZ8s;$KyMJnzN5{jIgm%3D7Su62_P2}}qUTEEY}BLDzC!o0Eo delta 1436 zcmV;N1!MZ)65tXtK~_N^Q*L2!b7*gLAa*kf0{~LcJJ4kk4o-(LoEakZdp}QvqTfbV zu70#Z${pUXAw-cfB?eQf3Zh6Ff1P9>qk_qY&YQsxdr{k^Kqd7(>cnGlPW}tKNOD?Z$$PA_9_!G@xn(VIZLc!UF@1vB4k%#9n6g-0J7d%GxDn)G-$`V7|n&Hu!SJ!g9-u`B%eHo6@CbtZ! z{ksU{%YQ^LaunjbfZ?e^CMjpKHG{DTe>)^{yi1vS9|1YYA_;pWk?(6khOrPIMMU3A zeT%RN`zco_-v`oendvHDD%IvsGht zIxu>s-}!FBnF|1LG*u`+?LeFyh13V1GpPtuuz$Dl!+;nrk@$*>8VLe{Qi4FA#uS-qKsFWNkR+kn2qMag*_b2} zMKO*jQz+^NSpOK)Yt`K;7}r)CP~GkSp*lxkomL{V>t{LDK;za*T6Nm(Hr#`iHr%@h z0UP=>BB89+Q@R{Tlhg!ZJi-`RfXt^@f__aAq?uo=daGVLjrrFfFHPC@ zI^Khv^0G6lIqrKa1$Ihc7CK(1Ku*R##ou9I;EEDQZ}IMW$iUtN#49+RjA zAOY)>$psz(bCc)=MSrT_e4&;PTmFnS*P|Z;k;%AE4qI`vQsLf*>&=EtSi^XT{ z=U#dTua&sVuD=9eWg&pwtxH%t3t8<3U&8uniM7N_P4(|%?zcH_c>%^DpVrttH1*FD8O{5BzBxyaW7bbr8>gZ5??wEw!k-`m*Q z?Rinqb??G~Ny6Ff4ts*XL|?gXe@rFBb_4-N<`@!%5(pd-N&TE9kqADK=)sPT$q1!= za%Mn|c2Dn!X|;cwQST70Yg`bz;U|Im3EBk6QHx5R=2x%s`6xZvbHd zkX)giG&O-uO@Efy?vb43^j!DuUDy+7YGO$hO4sc%nFxd_PhdNt`-F50Fi$;7rGj>uwumjep)!VJv|%c(#{bJq5`!W)^i-fgz7Iy(y8* zUI~mt;#=36uQ3k;6j|;+d~@k^XfWo9<_eobZS~=W%KFf5c|Y}Adczp|3YTlI=Ki)P z@*?p!JbwY7Fi=E{Pyu1ntemuIeaaJ&hoqGciKJ}Q%>J1pAn68Ix;`+MrAtTH`Ou^==X^i^TDt$He zmvr5`xlu!^VSM6`(IrCBp$?KV!A@b8tq6v8n`HF~4)R1NfsBZb@;qj;ScQF@& { await runIgnitionTest(c, t, opts); }); +test.serial('erc721 crossChainBridging erc7786native', async t => { + const opts: GenericOptions = { + kind: 'ERC721', + name: 'My Token', + symbol: 'MTK', + access: 'ownable', + crossChainBridging: 'erc7786native', + }; + const c = buildERC721(opts); + await runIgnitionTest(c, t, opts); +}); + +test.serial('governor', async t => { + const opts: GenericOptions = { + kind: 'Governor', + name: 'My Governor', + delay: '1 day', + period: '1 week', + }; + const c = buildGovernor(opts); + await runIgnitionTest(c, t, opts); +}); + test.serial('account ecdsa', async t => { const opts: GenericOptions = { kind: 'Account', name: 'My Account', signer: 'ECDSA' }; const c = buildAccount(opts); diff --git a/packages/core/solidity/src/zip-hardhat.test.ts.md b/packages/core/solidity/src/zip-hardhat.test.ts.md index 9347888f3..3edf8b119 100644 --- a/packages/core/solidity/src/zip-hardhat.test.ts.md +++ b/packages/core/solidity/src/zip-hardhat.test.ts.md @@ -10,7 +10,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -100,7 +100,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ @@ -148,7 +148,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -282,8 +282,8 @@ Generated by [AVA](https://avajs.dev). "license": "MIT",␊ "devDependencies": {␊ "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ - "@openzeppelin/contracts": "^5.6.0",␊ - "@openzeppelin/contracts-upgradeable": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "@openzeppelin/contracts-upgradeable": "^5.7.0",␊ "@openzeppelin/hardhat-upgrades": "^4.0.2",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ @@ -347,7 +347,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";␊ @@ -403,8 +403,8 @@ Generated by [AVA](https://avajs.dev). "license": "MIT",␊ "devDependencies": {␊ "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ - "@openzeppelin/contracts": "^5.6.0",␊ - "@openzeppelin/contracts-upgradeable": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "@openzeppelin/contracts-upgradeable": "^5.7.0",␊ "@openzeppelin/hardhat-upgrades": "^4.0.2",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ @@ -466,7 +466,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -516,7 +516,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ @@ -555,13 +555,278 @@ Generated by [AVA](https://avajs.dev). `, ] +## erc721 crossChainBridging erc7786native + +> Snapshot 1 + + [ + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ + import {CrosschainLinked} from "@openzeppelin/contracts/crosschain/CrosschainLinked.sol";␊ + import {ERC721} from "@openzeppelin/contracts/token/ERC721/ERC721.sol";␊ + import {ERC721Crosschain} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Crosschain.sol";␊ + ␊ + contract MyToken is ERC721, ERC721Crosschain, Ownable {␊ + constructor(CrosschainLinked.Link[] memory links, address initialOwner)␊ + ERC721("My Token", "MTK")␊ + CrosschainLinked(links)␊ + Ownable(initialOwner)␊ + {}␊ + ␊ + function setLink(address gateway, bytes memory counterpart) public onlyOwner {␊ + _setLink(gateway, counterpart, false);␊ + }␊ + }␊ + `, + `import { defineConfig } from "hardhat/config";␊ + import hardhatEthers from "@nomicfoundation/hardhat-ethers";␊ + import hardhatIgnitionEthers from "@nomicfoundation/hardhat-ignition-ethers";␊ + ␊ + export default defineConfig({␊ + plugins: [hardhatEthers, hardhatIgnitionEthers],␊ + solidity: {␊ + version: "0.8.27",␊ + settings: {␊ + evmVersion: 'cancun',␊ + optimizer: {␊ + enabled: true,␊ + },␊ + },␊ + },␊ + });␊ + `, + `{␊ + "name": "hardhat-sample",␊ + "version": "0.0.1",␊ + "type": "module",␊ + "description": "",␊ + "main": "index.js",␊ + "scripts": {␊ + "compile": "hardhat compile",␊ + "test": "hardhat compile && ava"␊ + },␊ + "author": "",␊ + "license": "MIT",␊ + "devDependencies": {␊ + "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ + "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ + "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "ava": "^6.0.0",␊ + "ethers": "^6.8.1",␊ + "hardhat": "^3.6.0",␊ + "tsx": "^4.7.0",␊ + "typescript": "^5.0.0"␊ + }␊ + }`, + `import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";␊ + ␊ + export default buildModule("MyTokenModule", (m) => {␊ + ␊ + // TODO: Set values for the constructor arguments below␊ + const myToken = m.contract("MyToken", [links, initialOwner]);␊ + ␊ + return { myToken };␊ + });␊ + `, + `import test from "ava";␊ + import hre from "hardhat";␊ + ␊ + const connection = await hre.network.create();␊ + const { ethers } = connection;␊ + ␊ + test.after.always(() => connection.close());␊ + ␊ + test("MyToken", async t => {␊ + const ContractFactory = await ethers.getContractFactory("MyToken");␊ + ␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + const links = ...;␊ + const initialOwner = (await ethers.getSigners())[1].address;␊ + const instance = await ContractFactory.deploy(links, initialOwner);␊ + await instance.waitForDeployment();␊ + */␊ + ␊ + t.pass();␊ + });␊ + `, + ] + +## governor + +> Snapshot 1 + + [ + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ + pragma solidity ^0.8.27;␊ + ␊ + import {Governor} from "@openzeppelin/contracts/governance/Governor.sol";␊ + import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol";␊ + import {GovernorCountingSimple} from "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";␊ + import {GovernorSettings} from "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";␊ + import {GovernorTimelockControl} from "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";␊ + import {GovernorVotes} from "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";␊ + import {GovernorVotesQuorumFraction} from "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";␊ + import {IVotes} from "@openzeppelin/contracts/governance/utils/IVotes.sol";␊ + ␊ + contract MyGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorVotesQuorumFraction, GovernorTimelockControl {␊ + constructor(IVotes _token, TimelockController _timelock)␊ + Governor("My Governor")␊ + GovernorSettings(7200 /* 1 day */, 50400 /* 1 week */, 0)␊ + GovernorVotes(_token)␊ + GovernorVotesQuorumFraction(4)␊ + GovernorTimelockControl(_timelock)␊ + {}␊ + ␊ + // The following functions are overrides required by Solidity.␊ + ␊ + function state(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (ProposalState)␊ + {␊ + return super.state(proposalId);␊ + }␊ + ␊ + function proposalNeedsQueuing(uint256 proposalId)␊ + public␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (bool)␊ + {␊ + return super.proposalNeedsQueuing(proposalId);␊ + }␊ + ␊ + function proposalThreshold()␊ + public␊ + view␊ + override(Governor, GovernorSettings)␊ + returns (uint256)␊ + {␊ + return super.proposalThreshold();␊ + }␊ + ␊ + function _queueOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint48)␊ + {␊ + return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executeOperations(uint256 proposalId, address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + {␊ + super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _cancel(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)␊ + internal␊ + override(Governor, GovernorTimelockControl)␊ + returns (uint256)␊ + {␊ + return super._cancel(targets, values, calldatas, descriptionHash);␊ + }␊ + ␊ + function _executor()␊ + internal␊ + view␊ + override(Governor, GovernorTimelockControl)␊ + returns (address)␊ + {␊ + return super._executor();␊ + }␊ + }␊ + `, + `import { defineConfig } from "hardhat/config";␊ + import hardhatEthers from "@nomicfoundation/hardhat-ethers";␊ + import hardhatIgnitionEthers from "@nomicfoundation/hardhat-ignition-ethers";␊ + ␊ + export default defineConfig({␊ + plugins: [hardhatEthers, hardhatIgnitionEthers],␊ + solidity: {␊ + version: "0.8.27",␊ + settings: {␊ + evmVersion: 'cancun',␊ + optimizer: {␊ + enabled: true,␊ + },␊ + },␊ + },␊ + });␊ + `, + `{␊ + "name": "hardhat-sample",␊ + "version": "0.0.1",␊ + "type": "module",␊ + "description": "",␊ + "main": "index.js",␊ + "scripts": {␊ + "compile": "hardhat compile",␊ + "test": "hardhat compile && ava"␊ + },␊ + "author": "",␊ + "license": "MIT",␊ + "devDependencies": {␊ + "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ + "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ + "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "ava": "^6.0.0",␊ + "ethers": "^6.8.1",␊ + "hardhat": "^3.6.0",␊ + "tsx": "^4.7.0",␊ + "typescript": "^5.0.0"␊ + }␊ + }`, + `import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";␊ + ␊ + export default buildModule("MyGovernorModule", (m) => {␊ + ␊ + // TODO: Set values for the constructor arguments below␊ + const myGovernor = m.contract("MyGovernor", [_token, _timelock]);␊ + ␊ + return { myGovernor };␊ + });␊ + `, + `import test from "ava";␊ + import hre from "hardhat";␊ + ␊ + const connection = await hre.network.create();␊ + const { ethers } = connection;␊ + ␊ + test.after.always(() => connection.close());␊ + ␊ + test("MyGovernor", async t => {␊ + const ContractFactory = await ethers.getContractFactory("MyGovernor");␊ + ␊ + // TODO: Set values for the variables below, then uncomment the following section:␊ + /*␊ + const _token = ...;␊ + const _timelock = ...;␊ + const instance = await ContractFactory.deploy(_token, _timelock);␊ + await instance.waitForDeployment();␊ + */␊ + ␊ + t.pass();␊ + });␊ + `, + ] + ## account ecdsa > Snapshot 1 [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Account} from "@openzeppelin/contracts/account/Account.sol";␊ @@ -608,7 +873,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ @@ -653,7 +918,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {SignerECDSAUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/cryptography/signers/SignerECDSAUpgradeable.sol";␊ @@ -712,8 +977,8 @@ Generated by [AVA](https://avajs.dev). "license": "MIT",␊ "devDependencies": {␊ "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ - "@openzeppelin/contracts": "^5.6.0",␊ - "@openzeppelin/contracts-upgradeable": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "@openzeppelin/contracts-upgradeable": "^5.7.0",␊ "@openzeppelin/hardhat-upgrades": "^4.0.2",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ @@ -814,7 +1079,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ @@ -857,7 +1122,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";␊ @@ -899,8 +1164,8 @@ Generated by [AVA](https://avajs.dev). "license": "MIT",␊ "devDependencies": {␊ "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ - "@openzeppelin/contracts": "^5.6.0",␊ - "@openzeppelin/contracts-upgradeable": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ + "@openzeppelin/contracts-upgradeable": "^5.7.0",␊ "@openzeppelin/hardhat-upgrades": "^4.0.2",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ @@ -960,7 +1225,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -1003,7 +1268,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ @@ -1046,7 +1311,7 @@ Generated by [AVA](https://avajs.dev). [ `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0␊ + // Compatible with OpenZeppelin Contracts ^5.7.0␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1096,7 +1361,7 @@ Generated by [AVA](https://avajs.dev). "@nomicfoundation/hardhat-ethers": "^4.0.2",␊ "@nomicfoundation/hardhat-ignition": "^3.0.0",␊ "@nomicfoundation/hardhat-ignition-ethers": "^3.0.0",␊ - "@openzeppelin/contracts": "^5.6.0",␊ + "@openzeppelin/contracts": "^5.7.0",␊ "ava": "^6.0.0",␊ "ethers": "^6.8.1",␊ "hardhat": "^3.6.0",␊ diff --git a/packages/core/solidity/src/zip-hardhat.test.ts.snap b/packages/core/solidity/src/zip-hardhat.test.ts.snap index 025fbac4cf95ae17ebb80cca7e7c8c178f04a3dd..ecdc9969defa8a1f49bd8c4f2f4a24803bcb20dd 100644 GIT binary patch literal 4808 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 aRD5IN7yici$VFWAiT?+}5~`&}fdBxcb-cI$ diff --git a/packages/core/solidity/src/zip-hardhat.ts b/packages/core/solidity/src/zip-hardhat.ts index e86dcb15a..1f9eb7968 100644 --- a/packages/core/solidity/src/zip-hardhat.ts +++ b/packages/core/solidity/src/zip-hardhat.ts @@ -1,10 +1,11 @@ import JSZip from 'jszip'; import type { GenericOptions } from './build-generic'; -import type { Contract, FunctionArgument } from './contract'; +import type { Contract } from './contract'; import { printContract } from './print'; import SOLIDITY_VERSION from './solidity-version.json'; import type { Lines } from './utils/format-lines'; import { formatLinesWithSpaces, spaceBetween } from './utils/format-lines'; +import { addTodoAndCommentOut, hasNonAddressArgs, isAddressType } from './zip-shared'; class TestGenerator { constructor(private parent: HardhatZipGenerator) {} @@ -20,12 +21,8 @@ class TestGenerator { 'it("Test contract", async function () {', spaceBetween( [`const ContractFactory = await ethers.getContractFactory("${c.name}");`], - this.declareVariables(c.constructorArgs), - this.getDeployLines( - c, - c.constructorArgs.map(a => a.name), - ), - this.getExpects(opts), + ...getDeploymentSteps(c, this.parent), + this.getAssertions(c, opts), ), '});', ], @@ -40,6 +37,15 @@ class TestGenerator { ]; } + private getAssertions(c: Contract, opts?: GenericOptions): Lines[] { + if (hasNonAddressArgs(c)) { + // The deployment is commented out until the user fills in the missing constructor arguments, + // so there is no `instance` to assert against yet. + return []; + } + return this.getExpects(opts); + } + private getExpects(opts?: GenericOptions): Lines[] { if (opts !== undefined) { switch (opts.kind) { @@ -58,31 +64,27 @@ class TestGenerator { } return []; } +} - private declareVariables(args: FunctionArgument[]): Lines[] { - return args.flatMap((arg, i) => { - if (arg.type === 'address') { - return [`const ${arg.name} = (await ethers.getSigners())[${i}].address;`]; - } else { - return [`// TODO: Set the following constructor argument`, `// const ${arg.name} = ...;`]; - } - }); - } - - private getDeployLines(c: Contract, argNames: string[]): Lines[] { - if (c.constructorArgs.some(a => a.type !== 'address')) { - return [ - `// TODO: Uncomment the below when the missing constructor arguments are set above`, - `// const instance = await ${this.parent.getDeploymentCall(c, argNames)};`, - `// await instance.waitForDeployment();`, - ]; - } else { - return [ - `const instance = await ${this.parent.getDeploymentCall(c, argNames)};`, - 'await instance.waitForDeployment();', - ]; - } - } +/** + * Steps to declare the constructor arguments and deploy the contract, as groups of lines + * to be separated by blank lines. If any constructor argument cannot be given a default + * value (i.e. is not an address), the whole deployment is commented out behind a single + * TODO so that the user can fill in the values and uncomment the entire section at once. + */ +function getDeploymentSteps(c: Contract, generator: HardhatZipGenerator): Lines[][] { + const argNames = c.constructorArgs.map(a => a.name); + const declarations = c.constructorArgs.map((arg, i) => + isAddressType(arg) ? `const ${arg.name} = (await ethers.getSigners())[${i}].address;` : `const ${arg.name} = ...;`, + ); + const deployment = [ + `const instance = await ${generator.getDeploymentCall(c, argNames)};`, + 'await instance.waitForDeployment();', + ]; + if (hasNonAddressArgs(c)) { + return [addTodoAndCommentOut(c, [...declarations, ...deployment])]; + } + return [declarations, deployment]; } /** @@ -354,13 +356,11 @@ class Hardhat3TestGenerator { } private getTestCase(c: Contract, opts?: GenericOptions): Lines[] { - const argNames = c.constructorArgs.map(a => a.name); return [ `test("${c.name}", async t => {`, spaceBetween( [`const ContractFactory = await ethers.getContractFactory("${c.name}");`], - this.declareVariables(c.constructorArgs), - this.getDeployLines(c, argNames), + ...getDeploymentSteps(c, this.parent), this.getAssertions(c, opts), ), '});', @@ -368,7 +368,7 @@ class Hardhat3TestGenerator { } private getAssertions(c: Contract, opts?: GenericOptions): Lines[] { - if (c.constructorArgs.some(a => a.type !== 'address')) { + if (hasNonAddressArgs(c)) { // The deployment is commented out until the user fills in the missing constructor arguments, // so there is no `instance` to assert against yet. `t.pass()` keeps AVA happy in the meantime. return ['t.pass();']; @@ -396,31 +396,6 @@ class Hardhat3TestGenerator { } return []; } - - private declareVariables(args: FunctionArgument[]): Lines[] { - return args.flatMap((arg, i) => { - if (arg.type === 'address') { - return [`const ${arg.name} = (await ethers.getSigners())[${i}].address;`]; - } else { - return [`// TODO: Set the following constructor argument`, `// const ${arg.name} = ...;`]; - } - }); - } - - private getDeployLines(c: Contract, argNames: string[]): Lines[] { - if (c.constructorArgs.some(a => a.type !== 'address')) { - return [ - `// TODO: Uncomment the below when the missing constructor arguments are set above`, - `// const instance = await ${this.parent.getDeploymentCall(c, argNames)};`, - `// await instance.waitForDeployment();`, - ]; - } else { - return [ - `const instance = await ${this.parent.getDeploymentCall(c, argNames)};`, - 'await instance.waitForDeployment();', - ]; - } - } } /** diff --git a/packages/core/solidity/src/zip-shared.ts b/packages/core/solidity/src/zip-shared.ts new file mode 100644 index 000000000..51753f8e5 --- /dev/null +++ b/packages/core/solidity/src/zip-shared.ts @@ -0,0 +1,38 @@ +import type { Contract, FunctionArgument } from './contract'; +import type { Lines } from './utils/format-lines'; + +/** + * Whether a constructor argument can be given a default value in a generated project. + * + * The generators fill these in with a signer, so this must agree everywhere it is used: an argument + * that is treated as an address in one place but not another would leave an unset placeholder in + * code that is not commented out. + */ +export function isAddressType(arg: FunctionArgument): boolean { + return arg.type === 'address'; +} + +/** + * Whether any constructor argument cannot be given a default value in a generated project. + * + * Address arguments are filled in with a signer, so a contract with only address arguments can be + * deployed as-is. Anything else must be supplied by the user, which means the generated deployment + * is commented out and there is no deployed instance for the generated tests to assert against. + */ +export function hasNonAddressArgs(c: Contract): boolean { + return !c.constructorArgs.every(isAddressType); +} + +/** + * Comments out a section of generated code behind a single TODO, so that the user can fill in the + * missing constructor arguments and uncomment the whole section at once. + */ +export function addTodoAndCommentOut(c: Contract, lines: Lines[]): Lines[] { + const values = hasNonAddressArgs(c) ? 'values' : 'addresses'; + return [ + `// TODO: Set ${values} for the variables below, then uncomment the following section:`, + '/*', + ...lines, + '*/', + ]; +} diff --git a/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.md b/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.md index 9e36e8caf..a2ff7733f 100644 --- a/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.md +++ b/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.md @@ -9,6 +9,6 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 [ - '@openzeppelin/contracts/=@openzeppelin/contracts@5.6.0/', + '@openzeppelin/contracts/=@openzeppelin/contracts@5.7.0/', '@openzeppelin/uniswap-hooks/=@openzeppelin/uniswap-hooks@1.2.1/src/', ] diff --git a/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.snap b/packages/core/uniswap-hooks/src/get-versioned-remappings.test.ts.snap index eb42a18b7a4a58c272248d72bb07e014143ee571..75e9ceb37826826d92f2942c2c9376fb5aaf72ef 100644 GIT binary patch delta 72 zcmV-O0Jr~*0*wMPK~_N^Q*L2!b7*gLAa*kf0|1Xm_?Er3ee?Di!{M1O>A35+n=g>k e0xhv~xyab`cC(Q(vjJ9-<{t=^x_h`D0RRAOH6U~V delta 72 zcmV-O0Jr~*0*wMPK~_N^Q*L2!b7*gLAa*kf0|4|1agvkdc$u%$^_6zE)Q-X8qt2Qm e=6sNuouQ#N-KLQ;vjJL><{t Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";␊ @@ -433,7 +433,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {SlotDerivation} from "@openzeppelin/contracts/utils/SlotDerivation.sol";␊ @@ -479,7 +479,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -524,7 +524,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -570,7 +570,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -615,7 +615,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -708,7 +708,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -788,7 +788,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -868,7 +868,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -1374,7 +1374,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";␊ @@ -1447,7 +1447,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {SlotDerivation} from "@openzeppelin/contracts/utils/SlotDerivation.sol";␊ @@ -1522,7 +1522,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1596,7 +1596,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -1671,7 +1671,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -1745,7 +1745,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -1841,7 +1841,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -1915,7 +1915,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -1989,7 +1989,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -2060,7 +2060,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2158,7 +2158,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2264,7 +2264,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2377,7 +2377,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2515,7 +2515,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2617,7 +2617,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2718,7 +2718,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -2821,7 +2821,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -2921,7 +2921,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -3022,7 +3022,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -3122,7 +3122,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -3252,7 +3252,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -3350,7 +3350,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -3448,7 +3448,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -3543,7 +3543,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -3648,7 +3648,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -3761,7 +3761,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -3890,7 +3890,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -4035,7 +4035,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -4144,7 +4144,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -4252,7 +4252,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -4362,7 +4362,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -4469,7 +4469,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -4577,7 +4577,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -4684,7 +4684,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -4830,7 +4830,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -4935,7 +4935,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -5040,7 +5040,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -5142,7 +5142,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5243,7 +5243,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5345,7 +5345,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5438,7 +5438,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5572,7 +5572,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5677,7 +5677,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5781,7 +5781,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5887,7 +5887,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -5988,7 +5988,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -6093,7 +6093,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -6194,7 +6194,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -6308,7 +6308,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -6409,7 +6409,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -6510,7 +6510,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -6610,7 +6610,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -6700,7 +6700,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -6783,7 +6783,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -6882,7 +6882,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -7005,7 +7005,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -7099,7 +7099,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -7192,7 +7192,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -7287,7 +7287,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -7379,7 +7379,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -7472,7 +7472,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -7564,7 +7564,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -7678,7 +7678,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -7768,7 +7768,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -7858,7 +7858,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -7945,7 +7945,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8051,7 +8051,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8149,7 +8149,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8247,7 +8247,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8377,7 +8377,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8487,7 +8487,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8596,7 +8596,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -8707,7 +8707,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -8815,7 +8815,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -8924,7 +8924,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -9032,7 +9032,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -9162,7 +9162,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -9268,7 +9268,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -9374,7 +9374,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -9477,7 +9477,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -9591,7 +9591,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -9697,7 +9697,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -9794,7 +9794,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -9932,7 +9932,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -10049,7 +10049,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -10166,7 +10166,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -10285,7 +10285,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -10401,7 +10401,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -10518,7 +10518,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -10634,7 +10634,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -10767,7 +10767,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -10881,7 +10881,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -10995,7 +10995,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -11106,7 +11106,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11204,7 +11204,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11294,7 +11294,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11384,7 +11384,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11506,7 +11506,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11608,7 +11608,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11709,7 +11709,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -11812,7 +11812,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -11912,7 +11912,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -12013,7 +12013,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -12113,7 +12113,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -12235,7 +12235,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -12333,7 +12333,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -12431,7 +12431,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -12526,7 +12526,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -12635,7 +12635,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -12719,7 +12719,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -12803,7 +12803,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -12920,7 +12920,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -13033,7 +13033,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -13145,7 +13145,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -13259,7 +13259,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -13370,7 +13370,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -13482,7 +13482,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -13593,7 +13593,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -13717,7 +13717,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -13826,7 +13826,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -13935,7 +13935,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -14043,7 +14043,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14149,7 +14149,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14239,7 +14239,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14312,7 +14312,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14426,7 +14426,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14536,7 +14536,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14645,7 +14645,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -14756,7 +14756,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -14864,7 +14864,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -14973,7 +14973,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -15081,7 +15081,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -15227,7 +15227,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -15333,7 +15333,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -15439,7 +15439,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -15542,7 +15542,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -15674,7 +15674,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -15782,7 +15782,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -15898,7 +15898,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -16038,7 +16038,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -16173,7 +16173,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -16308,7 +16308,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -16445,7 +16445,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -16579,7 +16579,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -16714,7 +16714,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -16848,7 +16848,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -17023,7 +17023,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17155,7 +17155,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17284,7 +17284,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17413,7 +17413,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17522,7 +17522,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17607,7 +17607,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17692,7 +17692,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17809,7 +17809,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -17922,7 +17922,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -18034,7 +18034,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -18148,7 +18148,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -18259,7 +18259,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -18371,7 +18371,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -18482,7 +18482,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -18615,7 +18615,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -18724,7 +18724,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -18833,7 +18833,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ @@ -18941,7 +18941,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19050,7 +19050,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19135,7 +19135,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19220,7 +19220,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19337,7 +19337,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19450,7 +19450,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19562,7 +19562,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -19676,7 +19676,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -19787,7 +19787,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessControl} from "@openzeppelin/contracts/access/AccessControl.sol";␊ @@ -19899,7 +19899,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {AccessManaged} from "@openzeppelin/contracts/access/manager/AccessManaged.sol";␊ @@ -20010,7 +20010,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";␊ @@ -20143,7 +20143,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";␊ @@ -20252,7 +20252,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC1155} from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";␊ @@ -20361,7 +20361,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts ^5.6.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ + // Compatible with OpenZeppelin Contracts ^5.7.0 and OpenZeppelin Uniswap Hooks ^1.2.1␊ pragma solidity ^0.8.27;␊ ␊ import {ERC6909} from "@openzeppelin/contracts/token/ERC6909/ERC6909.sol";␊ diff --git a/packages/core/uniswap-hooks/src/hooks.test.ts.snap b/packages/core/uniswap-hooks/src/hooks.test.ts.snap index 4035db71043754336b5f7876d4189021c4e9a2e7..12632fdb52d8ddbc4074fcfc49c61d99bbf833bf 100644 GIT binary patch delta 19129 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€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 MU;Wl?yN-(i09jGAWB>pF delta 19164 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 bcyK{NfPsdDh>aNQ|NoONURJSP$Hf2u+6}WH diff --git a/packages/mcp/src/solidity/tools/erc1155.test.ts b/packages/mcp/src/solidity/tools/erc1155.test.ts index 33eb1d273..43ab1fade 100644 --- a/packages/mcp/src/solidity/tools/erc1155.test.ts +++ b/packages/mcp/src/solidity/tools/erc1155.test.ts @@ -47,6 +47,8 @@ test('all', async t => { mintable: true, supply: true, updatableUri: true, + crossChainBridging: 'erc7786native', + crossChainLinkAllowOverride: true, access: 'roles', upgradeable: 'uups', info: { diff --git a/packages/mcp/src/solidity/tools/erc1155.ts b/packages/mcp/src/solidity/tools/erc1155.ts index f84bed410..f0ec76194 100644 --- a/packages/mcp/src/solidity/tools/erc1155.ts +++ b/packages/mcp/src/solidity/tools/erc1155.ts @@ -15,7 +15,20 @@ export function registerSolidityERC1155(server: McpServer): RegisteredTool { inputSchema: solidityERC1155Schema, title: 'Solidity ERC1155', }, - async ({ name, uri, burnable, pausable, mintable, supply, updatableUri, access, upgradeable, info }) => { + async ({ + name, + uri, + burnable, + pausable, + mintable, + supply, + updatableUri, + crossChainBridging, + crossChainLinkAllowOverride, + access, + upgradeable, + info, + }) => { const opts: ERC1155Options = { name, uri, @@ -24,6 +37,8 @@ export function registerSolidityERC1155(server: McpServer): RegisteredTool { mintable, supply, updatableUri, + crossChainBridging, + crossChainLinkAllowOverride, access, upgradeable, info, diff --git a/packages/mcp/src/solidity/tools/erc721.test.ts b/packages/mcp/src/solidity/tools/erc721.test.ts index dcec44039..8c28ac290 100644 --- a/packages/mcp/src/solidity/tools/erc721.test.ts +++ b/packages/mcp/src/solidity/tools/erc721.test.ts @@ -50,6 +50,8 @@ test('all', async t => { mintable: true, incremental: true, votes: 'blocknumber', + crossChainBridging: 'erc7786native', + crossChainLinkAllowOverride: true, access: 'roles', upgradeable: 'uups', info: { diff --git a/packages/mcp/src/solidity/tools/erc721.ts b/packages/mcp/src/solidity/tools/erc721.ts index 31f6b7b78..70508f6c5 100644 --- a/packages/mcp/src/solidity/tools/erc721.ts +++ b/packages/mcp/src/solidity/tools/erc721.ts @@ -26,6 +26,8 @@ export function registerSolidityERC721(server: McpServer): RegisteredTool { mintable, incremental, votes, + crossChainBridging, + crossChainLinkAllowOverride, access, upgradeable, namespacePrefix, @@ -42,6 +44,8 @@ export function registerSolidityERC721(server: McpServer): RegisteredTool { mintable, incremental, votes, + crossChainBridging, + crossChainLinkAllowOverride, access, upgradeable, namespacePrefix, diff --git a/packages/mcp/src/solidity/tools/governor.test.ts b/packages/mcp/src/solidity/tools/governor.test.ts index 7d5ace969..f2e3c7865 100644 --- a/packages/mcp/src/solidity/tools/governor.test.ts +++ b/packages/mcp/src/solidity/tools/governor.test.ts @@ -55,6 +55,7 @@ test('all', async t => { quorumAbsolute: '5', storage: true, settings: true, + crossChainExecution: true, upgradeable: 'uups', info: { license: 'MIT', diff --git a/packages/mcp/src/solidity/tools/governor.ts b/packages/mcp/src/solidity/tools/governor.ts index 36b694b20..22b086e95 100644 --- a/packages/mcp/src/solidity/tools/governor.ts +++ b/packages/mcp/src/solidity/tools/governor.ts @@ -30,6 +30,7 @@ export function registerSolidityGovernor(server: McpServer): RegisteredTool { quorumAbsolute, storage, settings, + crossChainExecution, upgradeable, info, }) => { @@ -48,6 +49,7 @@ export function registerSolidityGovernor(server: McpServer): RegisteredTool { quorumAbsolute, storage, settings, + crossChainExecution, upgradeable, info, }; diff --git a/packages/ui/api/ai-assistant/function-definitions/solidity.ts b/packages/ui/api/ai-assistant/function-definitions/solidity.ts index ead437d5d..5f36b6edc 100644 --- a/packages/ui/api/ai-assistant/function-definitions/solidity.ts +++ b/packages/ui/api/ai-assistant/function-definitions/solidity.ts @@ -15,6 +15,8 @@ import { enumValues, extractStringEnumValues } from '../types/helpers.ts'; import type { QuorumMode, TimelockOptions, VotesOptions } from '../../../../core/solidity/dist/governor'; import type { ClockMode } from '../../../../core/solidity/dist/set-clock-mode'; import type { CrossChainBridging } from '../../../../core/solidity/dist/erc20'; +import type { CrossChainBridging as ERC721CrossChainBridging } from '../../../../core/solidity/dist/erc721'; +import type { CrossChainBridging as ERC1155CrossChainBridging } from '../../../../core/solidity/dist/erc1155'; import type { Limitations } from '../../../../core/solidity/dist/stablecoin'; import type { ERC7579ModulesOptions, SignatureValidationOptions } from '../../../../core/solidity/dist/account'; import type { SignerOptions } from '../../../../core/solidity/dist/signer'; @@ -126,6 +128,20 @@ export const solidityERC721AIFunctionDefinition = { ], description: solidityERC721Descriptions.votes, }, + crossChainBridging: { + anyOf: [ + { type: 'boolean', enum: [false] }, + { + type: 'string', + enum: extractStringEnumValues()(['erc7786native']), + }, + ], + description: solidityERC721Descriptions.crossChainBridging, + }, + crossChainLinkAllowOverride: { + type: 'boolean', + description: solidityERC721Descriptions.crossChainLinkAllowOverride, + }, namespacePrefix: { type: 'string', description: solidityCommonDescriptions.namespacePrefix, @@ -163,6 +179,20 @@ export const solidityERC1155AIFunctionDefinition = { type: 'boolean', description: solidityERC1155Descriptions.updatableUri, }, + crossChainBridging: { + anyOf: [ + { type: 'boolean', enum: [false] }, + { + type: 'string', + enum: extractStringEnumValues()(['erc7786native']), + }, + ], + description: solidityERC1155Descriptions.crossChainBridging, + }, + crossChainLinkAllowOverride: { + type: 'boolean', + description: solidityERC1155Descriptions.crossChainLinkAllowOverride, + }, }, required: contractExactRequiredKeys<'solidity', 'ERC1155'>()(['name', 'uri']), additionalProperties: false, @@ -323,6 +353,10 @@ export const solidityGovernorAIFunctionDefinition = { type: 'boolean', description: solidityGovernorDescriptions.settings, }, + crossChainExecution: { + type: 'boolean', + description: solidityGovernorDescriptions.crossChainExecution, + }, access: { type: 'boolean', enum: [false], diff --git a/packages/ui/src/solidity/ERC1155Controls.svelte b/packages/ui/src/solidity/ERC1155Controls.svelte index fdde6398d..ec2dd909e 100644 --- a/packages/ui/src/solidity/ERC1155Controls.svelte +++ b/packages/ui/src/solidity/ERC1155Controls.svelte @@ -7,6 +7,7 @@ import AccessControlSection from './AccessControlSection.svelte'; import UpgradeabilitySection from './UpgradeabilitySection.svelte'; import InfoSection from './InfoSection.svelte'; + import ExpandableToggleRadio from '../common/ExpandableToggleRadio.svelte'; export let opts: Required = { kind: 'ERC1155', @@ -17,6 +18,8 @@ export let errors: undefined | OptionsErrorMessages; $: requireAccessControl = erc1155.isAccessControlRequired(opts); + + $: showAllowOverride = opts.crossChainBridging === 'erc7786native';
@@ -77,6 +80,34 @@
+ +
+ + + {#if showAllowOverride} +

+ + Whether to allow replacing a crosschain link that has already been registered. +

+ {/if} +
+
+ diff --git a/packages/ui/src/solidity/ERC20Controls.svelte b/packages/ui/src/solidity/ERC20Controls.svelte index d46ad6698..6f20fab3c 100644 --- a/packages/ui/src/solidity/ERC20Controls.svelte +++ b/packages/ui/src/solidity/ERC20Controls.svelte @@ -51,10 +51,7 @@ showChainId = opts.premint !== '' && opts.premint !== '0' && opts.crossChainBridging !== false; } - let showAllowOverride = false; - $: { - showAllowOverride = opts.crossChainBridging === 'erc7786native'; - } + $: showAllowOverride = opts.crossChainBridging === 'erc7786native';
diff --git a/packages/ui/src/solidity/ERC721Controls.svelte b/packages/ui/src/solidity/ERC721Controls.svelte index fd9878875..66cff372a 100644 --- a/packages/ui/src/solidity/ERC721Controls.svelte +++ b/packages/ui/src/solidity/ERC721Controls.svelte @@ -9,6 +9,10 @@ import InfoSection from './InfoSection.svelte'; import ExpandableToggleRadio from '../common/ExpandableToggleRadio.svelte'; + import tippy, { type Instance as TippyInstance } from 'tippy.js'; + import { onMount } from 'svelte'; + import { crosschainIncrementalTooltipProps } from './crosschain-incremental-tooltip'; + export let opts: Required = { kind: 'ERC721', ...erc721.defaults, @@ -34,6 +38,32 @@ } $: requireAccessControl = erc721.isAccessControlRequired(opts); + + // Show notice when Auto Increment Ids is combined with Cross-Chain Bridging + let incrementalLabel: HTMLElement; + let bridgingLabel: HTMLElement; + let incrementalTooltip: TippyInstance | undefined; + let bridgingTooltip: TippyInstance | undefined; + onMount(() => { + incrementalTooltip = tippy(incrementalLabel, crosschainIncrementalTooltipProps); + bridgingTooltip = tippy(bridgingLabel, crosschainIncrementalTooltipProps); + }); + + let hadIncremental = opts.incremental; + let hadCrossChainBridging = opts.crossChainBridging; + $: { + if (opts.incremental && opts.crossChainBridging === 'erc7786native') { + if (!hadIncremental) { + incrementalTooltip?.show(); + } else if (hadCrossChainBridging === false) { + bridgingTooltip?.show(); + } + } + hadIncremental = opts.incremental; + hadCrossChainBridging = opts.crossChainBridging; + } + + $: showAllowOverride = opts.crossChainBridging === 'erc7786native';
@@ -67,7 +97,7 @@ Mintable Privileged accounts will be able to emit new tokens. - Read more.', - trigger: 'manual', - placement: 'bottom', - maxWidth: '22em', - allowHTML: true, - interactive: true, -}; +export const superchainTooltipProps = manualNoticeTooltipProps( + 'Important: Only available on chains in the Superchain. Requires deploying your contract to the same address on every chain in the Superchain. Read more.', +); diff --git a/yarn.lock b/yarn.lock index 7233f0a25..d3686243a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -677,13 +677,6 @@ semver "^7.5.3" tar "^7.4.0" -"@modelcontextprotocol/ext-apps@1.7.5": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@modelcontextprotocol/ext-apps/-/ext-apps-1.7.5.tgz#53004fadf7bef79c533e28b10893199c7bf46693" - integrity sha512-TjPH2S2y5UEGKhmI6+XGFuqfqOV4ppe1x6DA3txnUaEWkgtA4G5vo14jGKFZmegdkZ1H4QMLyujLvoU1BEdnAg== - dependencies: - "@standard-schema/spec" "^1.1.0" - "@modelcontextprotocol/sdk@^1.29.0": version "1.29.0" resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz#79786d8b525e269de850ac82b1f1f757f3915f44" @@ -719,13 +712,6 @@ dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@1.4.2", "@noble/curves@~1.4.0": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" - integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== - dependencies: - "@noble/hashes" "1.4.0" - "@noble/curves@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.9.0.tgz#13e0ca8be4a0ce66c113693a94514e5599f40cfc" @@ -747,21 +733,11 @@ dependencies: "@noble/hashes" "1.8.0" -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" - integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== - "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== -"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - "@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": version "1.7.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" @@ -772,16 +748,6 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@noble/secp256k1@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" - integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== - -"@noble/secp256k1@~1.7.0": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" - integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -916,10 +882,10 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/confidential-contracts/-/confidential-contracts-0.3.1.tgz#db381e2c5c590c184acd5804bec9400aef607ab5" integrity sha512-QudxmMktqHE+oUuBKIR0vTceuQnQTtTT7s+iJqTP6c3DLiLNiTSHLrxIG0bd3fVyS1ZSjzhFhCVpcLZdQXsShg== -"@openzeppelin/contracts-upgradeable@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.6.0.tgz#4165c73dba817fd0a5129fd84c4233cc6d892f0e" - integrity sha512-pJ4Qb4EGjemdvP/pbBZ+etXDB5PQJJf1tbIBDQqfQZMK3Lk8UuNCK+cWDluHZ28UfwH2WAwJLftyhJid4w63QA== +"@openzeppelin/contracts-upgradeable@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.7.0.tgz#1735bbf6fc71565f8771d148dc2c376a4506b600" + integrity sha512-dHA/P3AFsnNXcv82Kge/v35kK0ByNe1EFv4vvOnl//lc8svwRcj5i/bdXd5mdMolD4rjSKy6EWOwc6+7h1gjaQ== "@openzeppelin/contracts@^5.4.0": version "5.4.0" @@ -935,6 +901,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.6.0.tgz#cfc0d605dcc1ddebac8e74bcb138eae61dfbaa28" integrity sha512-eZJSS8+RbWzX/7oDJPi+lYzfeuWwHXSsw336Yff35pTkmLEwRWKde2PQMW2objjMi1C1hNn9QiHjGktEJPSSWQ== +"@openzeppelin/contracts@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.7.0.tgz#3b13b3e6fe8d426c2af247975ddf6ab2a5bf148e" + integrity sha512-IL2AZpI+7THMzt1u6Cxmc1zLwVnudtUGvrqXQ/HnbLKfQ/8dIWMMQPDwPIjRQzNrlAo4cxZaCGRB/XvwPo9ILA== + "@openzeppelin/uniswap-hooks@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@openzeppelin/uniswap-hooks/-/uniswap-hooks-1.2.1.tgz#94d88aaaa06975a552104d98d632be863999e4f9" @@ -1143,34 +1114,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz#5b2dd648a960b8fa00d76f2cc4eea2f03daa80f4" integrity sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w== -"@scure/base@~1.1.0", "@scure/base@~1.1.6": - version "1.1.9" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" - integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== - "@scure/base@~1.2.5": version "1.2.6" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== -"@scure/bip32@1.1.5": - version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" - integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== - dependencies: - "@noble/hashes" "~1.2.0" - "@noble/secp256k1" "~1.7.0" - "@scure/base" "~1.1.0" - -"@scure/bip32@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" - integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== - dependencies: - "@noble/curves" "~1.4.0" - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - "@scure/bip32@1.7.0": version "1.7.0" resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.7.0.tgz#b8683bab172369f988f1589640e53c4606984219" @@ -1180,22 +1128,6 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" -"@scure/bip39@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" - integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== - dependencies: - "@noble/hashes" "~1.2.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" - integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== - dependencies: - "@noble/hashes" "~1.4.0" - "@scure/base" "~1.1.6" - "@scure/bip39@1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.6.0.tgz#475970ace440d7be87a6086cbee77cb8f1a684f9" @@ -1277,11 +1209,6 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958" integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg== -"@standard-schema/spec@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8" - integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== - "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -2947,27 +2874,7 @@ etag@^1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== -ethereum-cryptography@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" - integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== - dependencies: - "@noble/hashes" "1.2.0" - "@noble/secp256k1" "1.7.1" - "@scure/bip32" "1.1.5" - "@scure/bip39" "1.1.1" - -ethereum-cryptography@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" - integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== - dependencies: - "@noble/curves" "1.4.2" - "@noble/hashes" "1.4.0" - "@scure/bip32" "1.4.0" - "@scure/bip39" "1.3.0" - -ethereum-cryptography@^3.2.0: +ethereum-cryptography@^1.0.3, ethereum-cryptography@^2.2.1, ethereum-cryptography@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-3.2.0.tgz#42a04b57834bf536e552b50a70b9ee5057c71dc6" integrity sha512-Urr5YVsalH+Jo0sYkTkv1MyI9bLYZwW8BENZCeE1QYaTHETEYx0Nv/SVsWkSqpYrzweg6d8KMY1wTjH/1m/BIg== From cbeb247bad70991ec85baba4d71ad1c4929b44ed Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Fri, 31 Jul 2026 17:13:15 -0400 Subject: [PATCH 3/4] Fix MCP App false drift when Controls coerce required options (#832) --- .changeset/mcp-app-drift-baseline.md | 5 + packages/ui/src/mcp-apps/KindApp.svelte | 44 ++++-- .../ui/src/mcp-apps/drift-behavior.test.ts | 139 ++++++++++++++++++ .../ui/src/mcp-apps/opts-snapshot.test.ts | 86 +++++++++++ packages/ui/src/mcp-apps/opts-snapshot.ts | 85 +++++++++-- 5 files changed, 335 insertions(+), 24 deletions(-) create mode 100644 .changeset/mcp-app-drift-baseline.md create mode 100644 packages/ui/src/mcp-apps/drift-behavior.test.ts create mode 100644 packages/ui/src/mcp-apps/opts-snapshot.test.ts diff --git a/.changeset/mcp-app-drift-baseline.md b/.changeset/mcp-app-drift-baseline.md new file mode 100644 index 000000000..79d213a00 --- /dev/null +++ b/.changeset/mcp-app-drift-baseline.md @@ -0,0 +1,5 @@ +--- +'@openzeppelin/contracts-mcp': patch +--- + +Fix MCP App false "preview differs" when tool options imply other options. diff --git a/packages/ui/src/mcp-apps/KindApp.svelte b/packages/ui/src/mcp-apps/KindApp.svelte index 2f9c4066f..d06d10664 100644 --- a/packages/ui/src/mcp-apps/KindApp.svelte +++ b/packages/ui/src/mcp-apps/KindApp.svelte @@ -4,7 +4,7 @@ import KindShell from './KindShell.svelte'; import type { HostSendCaps } from './deliver-contract'; import { NO_HOST_SEND_CAPS } from './deliver-contract'; - import { cloneOpts, nextInitialOpts, optsEqual } from './opts-snapshot'; + import { cloneOpts, isDrifted, nextBaseline, shouldCaptureBaseline } from './opts-snapshot'; import type { KindAdapter, KindErrors } from './adapter'; /** Supplies everything language-specific; see `adapter.ts`. */ @@ -18,16 +18,42 @@ // Bound by the active Controls component (same pattern as App.svelte allOpts[tab]) // eslint-disable-next-line @typescript-eslint/no-explicit-any let opts: any = undefined; + /** Options exactly as the opening tool run requested them; what `Restore original` restores. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - let initialOpts: any = undefined; + let originalOpts: any = undefined; + /** What *this* generator prints for `originalOpts` — the baseline the preview is compared to. */ + let originalCode: string | undefined = undefined; let errors: KindErrors | undefined; let contract: unknown = adapter.emptyContract(); + function printOpts(candidate: unknown): string | undefined { + try { + return adapter.print(adapter.build(candidate)); + } catch { + // Options the agent sent that do not build; the tool run itself errors too. A later + // apply retries, and `nextBaseline` recovers if only the accumulated merge is at fault. + return undefined; + } + } + function mergeHostOpts(incoming: Record | undefined, source: 'input' | 'result') { if (!incoming) return; - const previous = opts; - opts = { ...(opts ?? {}), ...incoming, kind }; - initialOpts = nextInitialOpts(initialOpts, previous, opts, source); + // Read before the merge, so an edit the user already made blocks a toolresult recapture. + const captureBaseline = shouldCaptureBaseline(originalCode, drifted, source); + const merged = { ...(opts ?? {}), ...incoming, kind }; + opts = merged; + if (!captureBaseline) return; + + // Baseline the options the tool run *asked for*, printed by the generator loaded now — + // never the source in the agent's reply. Implied defaults (access: false → ownable) and + // generator upgrades both print identically here, so neither reads as a user edit. + const baseline = nextBaseline(merged, { ...incoming, kind }, printOpts); + if (baseline === undefined) return; + originalOpts = baseline.opts; + originalCode = baseline.code; + if (baseline.supersedesOpts) { + opts = cloneOpts(baseline.opts); + } } mcpApp.ontoolinput = params => { @@ -51,17 +77,17 @@ } } - /** True once the user edits away from the opening tool-run snapshot. */ - $: drifted = opts != null && initialOpts != null && !optsEqual(opts, initialOpts); $: code = adapter.print(contract); $: highlightedCode = hostSendCaps.openLinks ? adapter.injectHyperlinks(adapter.highlight(code)) : adapter.highlight(code); $: hasErrors = errors !== undefined; + /** True once the user edits away from the source the opening tool run asked for. */ + $: drifted = isDrifted({ originalCode, code, hasErrors }); function restoreOriginal() { - if (initialOpts == null) return; - opts = cloneOpts(initialOpts); + if (originalOpts == null) return; + opts = cloneOpts(originalOpts); } diff --git a/packages/ui/src/mcp-apps/drift-behavior.test.ts b/packages/ui/src/mcp-apps/drift-behavior.test.ts new file mode 100644 index 000000000..bbac2bba4 --- /dev/null +++ b/packages/ui/src/mcp-apps/drift-behavior.test.ts @@ -0,0 +1,139 @@ +import test from 'ava'; +import { buildGeneric, printContract } from '@openzeppelin/wizard'; +import { cloneOpts, isDrifted, nextBaseline, shouldCaptureBaseline } from './opts-snapshot'; + +/** + * End-to-end drift behaviour over the sequence `KindApp.svelte` actually sees: host applies, + * Controls coercions, user edits, restore. + * + * The decisions come from the real helpers; only the wiring is reproduced here, because the + * component's own state is bound to Svelte and to a Controls component and there is no + * component-test setup in this package. Keep `apply` in step with `mergeHostOpts`. + */ +function makeApp(kind = 'ERC20') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let opts: any = undefined; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let originalOpts: any = undefined; + let originalCode: string | undefined = undefined; + let contract: unknown = undefined; + let hasErrors = false; + + const printOpts = (o: unknown) => { + try { + return printContract(buildGeneric(o as never)); + } catch { + return undefined; + } + }; + + /** The `$: if (opts)` block: `contract` keeps its last good value when the build throws. */ + const flush = () => { + try { + contract = buildGeneric(opts); + hasErrors = false; + } catch { + hasErrors = true; + } + }; + const code = () => (contract === undefined ? '' : printContract(contract as never)); + const drifted = () => isDrifted({ originalCode, code: code(), hasErrors }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function apply(incoming: any, source: 'input' | 'result') { + const captureBaseline = shouldCaptureBaseline(originalCode, drifted(), source); + const merged = { ...(opts ?? {}), ...incoming, kind }; + opts = merged; + if (captureBaseline) { + const baseline = nextBaseline(merged, { ...incoming, kind }, printOpts); + if (baseline !== undefined) { + originalOpts = baseline.opts; + originalCode = baseline.code; + if (baseline.supersedesOpts) opts = cloneOpts(baseline.opts); + } + } + flush(); + return captureBaseline; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const setOpts = (patch: any) => { + opts = { ...opts, ...patch }; + flush(); + }; + const restore = () => { + opts = cloneOpts(originalOpts); + flush(); + }; + + return { apply, setOpts, restore, drifted, opts: () => opts, originalOpts: () => originalOpts }; +} + +/** What an agent sends for a mintable token: access is left off, and the Controls fill it in. */ +const REQUESTED = { name: 'MyToken', symbol: 'MTK', mintable: true, access: false } as const; + +test('the coercion Controls apply to host options does not drift', t => { + const app = makeApp(); + app.apply(REQUESTED, 'input'); + app.setOpts({ access: 'ownable' }); // AccessControlSection, because mintable requires an owner + + t.is(app.originalOpts().access, false, 'the baseline keeps the options as requested'); + t.false(app.drifted()); +}); + +test('a user edit drifts, and a late toolresult cannot erase it', t => { + const app = makeApp(); + app.apply(REQUESTED, 'input'); + app.setOpts({ access: 'ownable' }); + app.setOpts({ pausable: true }); + t.true(app.drifted()); + + t.false(app.apply(REQUESTED, 'result'), 'recapture is blocked'); + t.true(app.drifted()); +}); + +// The preview freezes at its last good value while a build fails, so an invalid first edit leaves +// the source equal to the baseline. Neither the banner nor the recapture guard may be fooled. +test('an invalid first edit drifts and survives a toolresult', t => { + const app = makeApp(); + app.apply(REQUESTED, 'input'); + app.setOpts({ access: 'ownable' }); + app.setOpts({ premint: 'garbage' }); + + t.true(app.drifted(), 'the Restore link stays reachable'); + t.false(app.apply(REQUESTED, 'result')); + t.is(app.opts().premint, 'garbage', 'the edit is preserved'); +}); + +test('restore original clears drift', t => { + const app = makeApp(); + app.apply(REQUESTED, 'input'); + app.setOpts({ access: 'ownable' }); + app.setOpts({ access: 'roles' }); + t.true(app.drifted()); + + app.restore(); + app.setOpts({ access: 'ownable' }); // the Controls coerce again on the way back + t.false(app.drifted()); +}); + +test('a toolresult refines the baseline while the preview has not drifted', t => { + const app = makeApp(); + app.apply({ name: 'MyToken', symbol: 'MTK' }, 'input'); + + t.true(app.apply({ ...REQUESTED, pausable: true }, 'result')); + app.setOpts({ access: 'ownable' }); + t.true(app.originalOpts().pausable, 'the baseline moved to the resolved options'); + t.false(app.drifted()); +}); + +test('an unbuildable toolinput leaves no baseline, and the next apply captures one', t => { + const app = makeApp(); + app.apply({ name: 'MyToken', symbol: 'MTK', premint: 'garbage' }, 'input'); + t.falsy(app.originalOpts()); + + app.apply(REQUESTED, 'result'); + app.setOpts({ access: 'ownable' }); + t.truthy(app.originalOpts()); + t.false(app.drifted()); +}); diff --git a/packages/ui/src/mcp-apps/opts-snapshot.test.ts b/packages/ui/src/mcp-apps/opts-snapshot.test.ts new file mode 100644 index 000000000..2efa0b6a5 --- /dev/null +++ b/packages/ui/src/mcp-apps/opts-snapshot.test.ts @@ -0,0 +1,86 @@ +import test from 'ava'; +import { buildGeneric, printContract } from '@openzeppelin/wizard'; +import { cloneOpts, isDrifted, nextBaseline, shouldCaptureBaseline } from './opts-snapshot'; + +type StubOpts = Record; +/** Stands in for `adapter.print(adapter.build(opts))`; `bad` options fail to build. */ +const stubPrint = (opts: StubOpts) => (opts.bad ? undefined : JSON.stringify(opts)); + +test('cloneOpts returns a deep copy', t => { + const src = { access: false as const, mintable: true, nested: { x: 1 } }; + const copy = cloneOpts(src); + t.not(copy, src); + t.not(copy.nested, src.nested); + t.deepEqual(copy, src); +}); + +test('isDrifted stays quiet until there is a baseline to compare against', t => { + t.false(isDrifted({ originalCode: undefined, code: 'contract Foo {}', hasErrors: false })); + t.false(isDrifted({ originalCode: undefined, code: '', hasErrors: true })); +}); + +test('isDrifted reports a changed preview', t => { + t.false(isDrifted({ originalCode: 'contract Foo {}', code: 'contract Foo {}', hasErrors: false })); + t.true(isDrifted({ originalCode: 'contract Foo {}', code: 'contract Bar {}', hasErrors: false })); +}); + +// The preview freezes at its last good value while a build fails, so it can equal the baseline +// even though the form no longer does. Without this the banner and its Restore link would vanish +// exactly when the user needs them. +test('isDrifted reports an invalid form even when the stale preview matches', t => { + t.true(isDrifted({ originalCode: 'contract Foo {}', code: 'contract Foo {}', hasErrors: true })); +}); + +test('shouldCaptureBaseline captures on the first host apply', t => { + t.true(shouldCaptureBaseline(undefined, false, 'input')); + t.true(shouldCaptureBaseline(undefined, true, 'result'), 'nothing to protect without a baseline'); +}); + +test('shouldCaptureBaseline recaptures from a toolresult while the preview has not drifted', t => { + t.true(shouldCaptureBaseline('contract Foo {}', false, 'result')); +}); + +test('shouldCaptureBaseline keeps the baseline once the preview has drifted', t => { + t.false(shouldCaptureBaseline('contract Foo {}', true, 'result')); +}); + +test('shouldCaptureBaseline never recaptures from a toolinput', t => { + t.false(shouldCaptureBaseline('contract Foo {}', false, 'input')); + t.false(shouldCaptureBaseline('contract Foo {}', true, 'input')); +}); + +test('nextBaseline prefers the merged options when they build', t => { + const merged: StubOpts = { mintable: true, pausable: true }; + const baseline = nextBaseline(merged, { pausable: true }, stubPrint); + + t.deepEqual(baseline?.opts, merged); + t.is(baseline?.code, stubPrint(merged)); + t.false(baseline?.supersedesOpts); + t.not(baseline?.opts, merged, 'baseline must not alias options the Controls mutate'); +}); + +// Host applies accumulate, so one unbuildable apply would otherwise poison every later merge +// and leave drift undetectable for the rest of the session. +test('nextBaseline falls back to the incoming options when the merge does not build', t => { + const baseline = nextBaseline({ bad: true, mintable: true }, { mintable: true }, stubPrint); + + t.deepEqual(baseline?.opts, { mintable: true }); + t.true(baseline?.supersedesOpts, 'the buildable apply supersedes the stale arguments'); +}); + +test('nextBaseline defers when neither the merge nor the incoming options build', t => { + t.is(nextBaseline({ bad: true }, { bad: true }, stubPrint), undefined); +}); + +// Why drift is measured over generated source instead of options objects: Controls coerce required +// fields (access: false → ownable when mintable), and that coercion must not read as a user edit. +// Printing both option sets through one generator makes it invisible. This is the invariant the +// whole approach rests on — a coercion the generator does not imply is a bug in that pair, not a +// case for this logic to absorb. +test('implied access control prints identically to the coerced option', t => { + const requested = { kind: 'ERC20', name: 'MyToken', symbol: 'MTK', mintable: true, access: false } as const; + const coerced = { ...requested, access: 'ownable' } as const; + + t.is(printContract(buildGeneric(requested)), printContract(buildGeneric(coerced))); + t.notDeepEqual({ ...requested }, { ...coerced }); +}); diff --git a/packages/ui/src/mcp-apps/opts-snapshot.ts b/packages/ui/src/mcp-apps/opts-snapshot.ts index 003a9fbac..2f010edb6 100644 --- a/packages/ui/src/mcp-apps/opts-snapshot.ts +++ b/packages/ui/src/mcp-apps/opts-snapshot.ts @@ -3,26 +3,81 @@ export function cloneOpts(value: T): T { return structuredClone(value); } -export function optsEqual(a: unknown, b: unknown): boolean { - return JSON.stringify(a) === JSON.stringify(b); +/** + * Whether the preview has moved off the source the opening tool run asked for. + * + * Compares generated source rather than options, so the coercions Controls apply to host options + * (required `access: false` → `ownable`) are invisible: they describe the same contract the + * generator would have built anyway. A coercion that changes the source would show up here as a + * spurious edit, but that is a Controls/generator disagreement to fix at the source, not + * something this comparison should absorb. + * + * `hasErrors` counts on its own because the baseline options build by construction, so an invalid + * form is always a user edit — and because the preview freezes at its last good value while the + * build fails, which would otherwise hide the banner and its Restore link exactly when they are + * needed. + */ +export function isDrifted(state: { originalCode: string | undefined; code: string; hasErrors: boolean }): boolean { + const { originalCode, code, hasErrors } = state; + if (originalCode === undefined) { + return false; + } + return hasErrors || code !== originalCode; } /** - * Capture / refresh the "original" options from the opening tool run. - * First host apply wins; a later toolresult may replace the snapshot only while - * the UI is still at that original (no user drift yet). + * Whether this host apply should (re)capture the original-options baseline. + * + * The first apply always captures. A later toolresult may recapture only while the preview has + * not drifted: until then every value in `opts` came from the host or from a source-preserving + * coercion, so the newer and more complete host options are the better baseline. Once the user + * has edited, the opening tool run stays the reference point. + * + * Takes the same `drifted` the banner uses, so a form that is merely in an error state — where + * the preview is stale and would compare equal — still counts as edited and is left alone. */ -export function nextInitialOpts( - initial: unknown | undefined, - previousOpts: unknown | undefined, - nextOpts: unknown, +export function shouldCaptureBaseline( + baselineCode: string | undefined, + drifted: boolean, source: 'input' | 'result', -): unknown { - if (initial == null) { - return cloneOpts(nextOpts); +): boolean { + if (baselineCode === undefined) { + return true; + } + return source === 'result' && !drifted; +} + +export type Baseline = { + /** The original options, to build the baseline source and to restore from. */ + opts: T; + code: string; + /** The merged options do not build, so `opts` replaces them rather than only baselining them. */ + supersedesOpts: boolean; +}; + +/** + * The baseline for this host apply: the merged options if they build, else the incoming + * options alone. + * + * The fallback matters because host applies accumulate. An agent can call the tool with options + * that do not build (the tool run itself then errors), and those would otherwise poison every + * later merge, leaving the baseline unset and drift undetectable for the rest of the session. + * An apply that does build supersedes them — note this drops options only the earlier apply + * carried, which is the price of recovering a usable baseline. Undefined when neither builds; + * a later apply retries. + */ +export function nextBaseline( + merged: T, + incoming: T, + print: (opts: T) => string | undefined, +): Baseline | undefined { + const mergedCode = print(merged); + if (mergedCode !== undefined) { + return { opts: cloneOpts(merged), code: mergedCode, supersedesOpts: false }; } - if (source === 'result' && (previousOpts == null || optsEqual(previousOpts, initial))) { - return cloneOpts(nextOpts); + const incomingCode = print(incoming); + if (incomingCode !== undefined) { + return { opts: cloneOpts(incoming), code: incomingCode, supersedesOpts: true }; } - return initial; + return undefined; } From 3fa2e22992ef99af373165425394437b9f51552f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:32:19 +0000 Subject: [PATCH 4/4] Prepare Release (#830) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Eric Lau --- .changeset/mcp-app-drift-baseline.md | 5 ----- .changeset/mcp-apps-wizard-ui.md | 7 ------- .changeset/rename-confidential-erc7984-tool.md | 5 ----- .changeset/solidity-57-crosschain.md | 13 ------------- packages/cli/CHANGELOG.md | 12 ++++++++++++ packages/cli/package.json | 6 +++--- packages/common/CHANGELOG.md | 9 +++++++++ packages/common/package.json | 4 ++-- packages/core/solidity/CHANGELOG.md | 9 +++++++++ packages/core/solidity/package.json | 2 +- packages/mcp/CHANGELOG.md | 18 ++++++++++++++++++ packages/mcp/package.json | 6 +++--- 12 files changed, 57 insertions(+), 39 deletions(-) delete mode 100644 .changeset/mcp-app-drift-baseline.md delete mode 100644 .changeset/mcp-apps-wizard-ui.md delete mode 100644 .changeset/rename-confidential-erc7984-tool.md delete mode 100644 .changeset/solidity-57-crosschain.md diff --git a/.changeset/mcp-app-drift-baseline.md b/.changeset/mcp-app-drift-baseline.md deleted file mode 100644 index 79d213a00..000000000 --- a/.changeset/mcp-app-drift-baseline.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openzeppelin/contracts-mcp': patch ---- - -Fix MCP App false "preview differs" when tool options imply other options. diff --git a/.changeset/mcp-apps-wizard-ui.md b/.changeset/mcp-apps-wizard-ui.md deleted file mode 100644 index 7c421c17f..000000000 --- a/.changeset/mcp-apps-wizard-ui.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@openzeppelin/contracts-mcp': patch ---- - -Add MCP Apps interactive UIs for Wizard-backed generation tools. -- Each tool serves a fixed-kind Wizard controls + code preview App with Send Updates to Agent / Copy to Clipboard. -- Non-Apps clients still receive Markdown source from tools/call. diff --git a/.changeset/rename-confidential-erc7984-tool.md b/.changeset/rename-confidential-erc7984-tool.md deleted file mode 100644 index eeb0a20e7..000000000 --- a/.changeset/rename-confidential-erc7984-tool.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@openzeppelin/contracts-mcp': minor ---- - -- **Breaking changes**: Renamed the `erc7984` tool to `confidential-erc7984`. diff --git a/.changeset/solidity-57-crosschain.md b/.changeset/solidity-57-crosschain.md deleted file mode 100644 index 88f215dc5..000000000 --- a/.changeset/solidity-57-crosschain.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -'@openzeppelin/wizard': patch -'@openzeppelin/wizard-common': patch -'@openzeppelin/contracts-mcp': patch -'@openzeppelin/contracts-cli': patch ---- - -Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. -- ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. -- Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. -- Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. -- Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. -- **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 51eb8f267..df9ebd753 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 0.1.4 (2026-07-31) + +- Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. ([#825](https://github.com/OpenZeppelin/contracts-wizard/pull/825)) ([`89e9fab`](https://github.com/OpenZeppelin/contracts-wizard/commit/89e9fabcd6e76128e2935f43a5f8c00ad8ed6e1a)) + - ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. + - Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. + - Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. + - Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. + - **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. +- Updated dependencies [[`89e9fab`](https://github.com/OpenZeppelin/contracts-wizard/commit/89e9fabcd6e76128e2935f43a5f8c00ad8ed6e1a)]: + - @openzeppelin/wizard@0.10.12 + - @openzeppelin/wizard-common@0.5.4 + ## 0.1.3 (2026-06-26) - Add Stellar tokenized `Vault` contract type, a Fungible Token that issues shares for an underlying asset (ERC-4626-style), with support for pausable, upgradeable, and access control options. ([#821](https://github.com/OpenZeppelin/contracts-wizard/pull/821)) ([`c8a2962`](https://github.com/OpenZeppelin/contracts-wizard/commit/c8a29629c5c486fd5204b4b51e08c913b05f3379)) diff --git a/packages/cli/package.json b/packages/cli/package.json index 3385b9fcf..7cf61d0aa 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/contracts-cli", - "version": "0.1.3", + "version": "0.1.4", "description": "CLI for generating smart contracts using OpenZeppelin Contracts Wizard", "license": "AGPL-3.0-only", "repository": "https://github.com/OpenZeppelin/contracts-wizard", @@ -27,8 +27,8 @@ }, "dependencies": { "zod": "^4.0", - "@openzeppelin/wizard-common": "^0.5.3", - "@openzeppelin/wizard": "^0.10.10", + "@openzeppelin/wizard-common": "^0.5.4", + "@openzeppelin/wizard": "^0.10.12", "@openzeppelin/wizard-cairo": "^3.0.0", "@openzeppelin/wizard-stellar": "^0.6.3", "@openzeppelin/wizard-stylus": "^0.3.0", diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index cf5a2d10b..73d3c1d11 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog +## 0.5.4 (2026-07-31) + +- Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. ([#825](https://github.com/OpenZeppelin/contracts-wizard/pull/825)) + - ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. + - Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. + - Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. + - Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. + - **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. + ## 0.5.3 (2026-06-26) - Add Stellar tokenized `Vault` contract type, a Fungible Token that issues shares for an underlying asset (ERC-4626-style), with support for pausable, upgradeable, and access control options. ([#821](https://github.com/OpenZeppelin/contracts-wizard/pull/821)) diff --git a/packages/common/package.json b/packages/common/package.json index f766a5283..5734fb178 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/wizard-common", - "version": "0.5.3", + "version": "0.5.4", "description": "Common library for OpenZeppelin Contracts Wizard components. Used internally.", "license": "AGPL-3.0-only", "repository": "https://github.com/OpenZeppelin/contracts-wizard", @@ -34,7 +34,7 @@ "zod": "^4.0" }, "devDependencies": { - "@openzeppelin/wizard": "^0.10.10", + "@openzeppelin/wizard": "^0.10.12", "@openzeppelin/wizard-cairo": "^3.0.0", "@openzeppelin/wizard-stellar": "^0.6.3", "@openzeppelin/wizard-stylus": "^0.3.0", diff --git a/packages/core/solidity/CHANGELOG.md b/packages/core/solidity/CHANGELOG.md index 9e5136e93..eadb312c4 100644 --- a/packages/core/solidity/CHANGELOG.md +++ b/packages/core/solidity/CHANGELOG.md @@ -1,6 +1,15 @@ # Changelog +## 0.10.12 (2026-07-31) + +- Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. ([#825](https://github.com/OpenZeppelin/contracts-wizard/pull/825)) + - ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. + - Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. + - Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. + - Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. + - **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. + ## 0.10.11 (2026-06-18) - Reject line terminators in `info.securityContact` and `info.license` to prevent breaking out of the generated comment lines. Fixes [GHSA-9wxg-vf3r-56hc](https://github.com/OpenZeppelin/contracts-wizard/security/advisories/GHSA-9wxg-vf3r-56hc). ([#818](https://github.com/OpenZeppelin/contracts-wizard/pull/818)) diff --git a/packages/core/solidity/package.json b/packages/core/solidity/package.json index a6d524a93..3252652fb 100644 --- a/packages/core/solidity/package.json +++ b/packages/core/solidity/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/wizard", - "version": "0.10.11", + "version": "0.10.12", "description": "A boilerplate generator to get started with OpenZeppelin Contracts", "license": "AGPL-3.0-only", "repository": "https://github.com/OpenZeppelin/contracts-wizard", diff --git a/packages/mcp/CHANGELOG.md b/packages/mcp/CHANGELOG.md index 10a90b90b..8564b8a27 100644 --- a/packages/mcp/CHANGELOG.md +++ b/packages/mcp/CHANGELOG.md @@ -1,6 +1,24 @@ # Changelog +## 0.6.0 (2026-07-31) + +- **Breaking changes**: Renamed the `erc7984` tool to `confidential-erc7984`. ([#828](https://github.com/OpenZeppelin/contracts-wizard/pull/828)) +- Fix MCP App false "preview differs" when tool options imply other options. ([#832](https://github.com/OpenZeppelin/contracts-wizard/pull/832)) +- Add MCP Apps interactive UIs for Wizard-backed generation tools. ([#828](https://github.com/OpenZeppelin/contracts-wizard/pull/828)) + - Each tool serves a fixed-kind Wizard controls + code preview App with Send Updates to Agent / Copy to Clipboard. + - Non-Apps clients still receive Markdown source from tools/call. + +- Add Solidity cross-chain options for ERC721, ERC1155, and Governor using OpenZeppelin Contracts 5.7. ([#825](https://github.com/OpenZeppelin/contracts-wizard/pull/825)) + - ERC721/ERC1155: Add `crossChainBridging` and `crossChainLinkAllowOverride` options, using `ERC721Crosschain`/`ERC1155Crosschain`. + - Governor: Add `crossChainExecution` option, using `GovernorCrosschain`. + - Account: Update the `IERC4337` import path, which dropped its `draft-` prefix in Contracts 5.7. + - Fix compile errors in upgradeable ERC20 `crossChainBridging` variants. + - **Potentially breaking change**: Update to OpenZeppelin Contracts 5.7.0. +- Updated dependencies [[`89e9fab`](https://github.com/OpenZeppelin/contracts-wizard/commit/89e9fabcd6e76128e2935f43a5f8c00ad8ed6e1a)]: + - @openzeppelin/wizard@0.10.12 + - @openzeppelin/wizard-common@0.5.4 + ## 0.5.10 (2026-06-26) - Add Stellar tokenized `Vault` contract type, a Fungible Token that issues shares for an underlying asset (ERC-4626-style), with support for pausable, upgradeable, and access control options. ([#821](https://github.com/OpenZeppelin/contracts-wizard/pull/821)) diff --git a/packages/mcp/package.json b/packages/mcp/package.json index 0313bea41..a4e19de7f 100644 --- a/packages/mcp/package.json +++ b/packages/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/contracts-mcp", - "version": "0.5.10", + "version": "0.6.0", "description": "OpenZeppelin Contracts MCP Server", "license": "AGPL-3.0-only", "repository": "https://github.com/OpenZeppelin/contracts-wizard", @@ -27,8 +27,8 @@ }, "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@openzeppelin/wizard-common": "^0.5.3", - "@openzeppelin/wizard": "^0.10.10", + "@openzeppelin/wizard-common": "^0.5.4", + "@openzeppelin/wizard": "^0.10.12", "@openzeppelin/wizard-stylus": "^0.3.0", "@openzeppelin/wizard-stellar": "^0.6.3", "@openzeppelin/wizard-cairo": "^3.0.0",