From 26a54367f3d3af0dd32bce495809b6fcc2fd5d13 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Tue, 3 Dec 2024 14:39:11 +0100 Subject: [PATCH 01/20] feat: add main structure --- packages/core-cairo/src/api.ts | 7 + packages/core-cairo/src/build-generic.ts | 6 +- packages/core-cairo/src/governor.ts | 505 ++++++++++++++++++ packages/core-cairo/src/index.ts | 2 +- packages/core-cairo/src/kind.ts | 1 + packages/ui/src/cairo/App.svelte | 10 + packages/ui/src/cairo/GovernorControls.svelte | 241 +++++++++ 7 files changed, 770 insertions(+), 2 deletions(-) create mode 100644 packages/core-cairo/src/governor.ts create mode 100644 packages/ui/src/cairo/GovernorControls.svelte diff --git a/packages/core-cairo/src/api.ts b/packages/core-cairo/src/api.ts index f8b419626..d5634fb5c 100644 --- a/packages/core-cairo/src/api.ts +++ b/packages/core-cairo/src/api.ts @@ -3,6 +3,7 @@ import { printERC20, defaults as erc20defaults, isAccessControlRequired as erc20 import { printERC721, defaults as erc721defaults, isAccessControlRequired as erc721IsAccessControlRequired, ERC721Options } from './erc721'; import { printERC1155, defaults as erc1155defaults, isAccessControlRequired as erc1155IsAccessControlRequired, ERC1155Options } from './erc1155'; import { printAccount, defaults as accountDefaults, AccountOptions } from './account'; +import { printGovernor, defaults as governorDefaults, isAccessControlRequired as governorIsAccessControlRequired, GovernorOptions } from './governor'; import { printCustom, defaults as customDefaults, isAccessControlRequired as customIsAccessControlRequired, CustomOptions } from './custom'; export interface WizardAccountAPI{ @@ -39,6 +40,7 @@ export type ERC20 = WizardContractAPI; export type ERC721 = WizardContractAPI; export type ERC1155 = WizardContractAPI; export type Account = WizardAccountAPI; +export type Governor = WizardContractAPI; export type Custom = WizardContractAPI; export const erc20: ERC20 = { @@ -60,6 +62,11 @@ export const account: Account = { print: printAccount, defaults: accountDefaults, } +export const governor: Governor = { + print: printGovernor, + defaults: governorDefaults, + isAccessControlRequired: governorIsAccessControlRequired +} export const custom: Custom = { print: printCustom, defaults: customDefaults, diff --git a/packages/core-cairo/src/build-generic.ts b/packages/core-cairo/src/build-generic.ts index ef2e485b2..27fec9d27 100644 --- a/packages/core-cairo/src/build-generic.ts +++ b/packages/core-cairo/src/build-generic.ts @@ -3,12 +3,13 @@ import { ERC721Options, buildERC721 } from './erc721'; import { ERC1155Options, buildERC1155 } from './erc1155'; import { CustomOptions, buildCustom } from './custom'; import { AccountOptions, buildAccount } from './account'; - +import { GovernorOptions, buildGovernor } from './governor'; export interface KindedOptions { ERC20: { kind: 'ERC20' } & ERC20Options; ERC721: { kind: 'ERC721' } & ERC721Options; ERC1155: { kind: 'ERC1155' } & ERC1155Options; Account: { kind: 'Account' } & AccountOptions; + Governor: { kind: 'Governor' } & GovernorOptions; Custom: { kind: 'Custom' } & CustomOptions; } @@ -28,6 +29,9 @@ export function buildGeneric(opts: GenericOptions) { case 'Account': return buildAccount(opts); + case 'Governor': + return buildGovernor(opts); + case 'Custom': return buildCustom(opts); diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts new file mode 100644 index 000000000..765613bff --- /dev/null +++ b/packages/core-cairo/src/governor.ts @@ -0,0 +1,505 @@ +import { contractDefaults as commonDefaults, withCommonContractDefaults } from './common-options'; +import { CommonContractOptions } from './common-options'; +import { ContractBuilder, Contract, Value } from "./contract"; +import { OptionsError } from "./error"; +import { setAccessControl } from "./set-access-control"; +import { printContract } from "./print"; +import { setInfo } from "./set-info"; +import { setUpgradeable } from "./set-upgradeable"; +import { defineFunctions } from './utils/define-functions'; +// import { durationToBlocks, durationToTimestamp } from "./utils/duration"; +import { defineComponents } from './utils/define-components'; + +export const clockModeOptions = ['blocknumber', 'timestamp'] as const; +export const clockModeDefault = 'timestamp' as const; +export type ClockMode = typeof clockModeOptions[number]; + +export const defaults: Required = { + name: 'MyGovernor', + delay: '1 day', + period: '1 week', + votes: 'erc20votes', + clockMode: clockModeDefault, + timelock: 'openzeppelin', + blockTime: 12, + decimals: 18, + proposalThreshold: '0', + quorumMode: 'percent', + quorumPercent: 4, + quorumAbsolute: '', + storage: false, + settings: true, + access: commonDefaults.access, + upgradeable: commonDefaults.upgradeable, + info: commonDefaults.info +} as const; + +export const votesOptions = ['erc20votes', 'erc721votes'] as const; +export type VotesOptions = typeof votesOptions[number]; + +export const timelockOptions = [false, 'openzeppelin'] as const; +export type TimelockOptions = typeof timelockOptions[number]; + +export function printGovernor(opts: GovernorOptions = defaults): string { + return printContract(buildGovernor(opts)); +} + +export interface GovernorOptions extends CommonContractOptions { + name: string; + delay: string; + period: string; + blockTime?: number; + proposalThreshold?: string; + decimals?: number; + quorumMode?: 'percent' | 'absolute'; + quorumPercent?: number; + quorumAbsolute?: string; + votes?: VotesOptions; + clockMode?: ClockMode; + timelock?: TimelockOptions; + storage?: boolean; + settings?: boolean; +} + +export function isAccessControlRequired(opts: Partial): boolean { + return false; +} + +function withDefaults(opts: GovernorOptions): Required { + return { + ...opts, + ...withCommonContractDefaults(opts), + decimals: opts.decimals ?? defaults.decimals, + blockTime: opts.blockTime || defaults.blockTime, + quorumPercent: opts.quorumPercent ?? defaults.quorumPercent, + quorumAbsolute: opts.quorumAbsolute ?? defaults.quorumAbsolute, + proposalThreshold: opts.proposalThreshold || defaults.proposalThreshold, + settings: opts.settings ?? defaults.settings, + storage: opts.storage ?? defaults.storage, + quorumMode: opts.quorumMode ?? defaults.quorumMode, + votes: opts.votes ?? defaults.votes, + clockMode: opts.clockMode ?? defaults.clockMode, + timelock: opts.timelock ?? defaults.timelock + }; +} + +export function buildGovernor(opts: GovernorOptions): Contract { + const allOpts = withDefaults(opts); + + const c = new ContractBuilder(allOpts.name); + + // validateDecimals(allOpts.decimals); + + addBase(c, allOpts); + // addSettings(c, allOpts); + // addCounting(c); + // addStorage(c, allOpts); + // addVotes(c); + // addQuorum(c, allOpts); + // addTimelock(c, allOpts); + + // setAccessControl(c, allOpts.access); + // setUpgradeable(c, allOpts.upgradeable, allOpts.access); + // setInfo(c, allOpts.info); + + return c; +} + +const components = defineComponents( { + GovernorComponent: { + path: 'openzeppelin::governance::governor', + substorage: { + name: 'governor', + type: 'GovernorComponent::Storage', + }, + event: { + name: 'GovernorEvent', + type: 'GovernorComponent::Event', + }, + impls: [{ + name: 'GovernorImpl', + value: 'GovernorComponent::GovernorImpl', + }], + }, +}); + +function addBase(c: ContractBuilder, { name }: GovernorOptions) { + c.addComponent(components.GovernorComponent, [], true); +} + +// function addSettings(c: ContractBuilder, allOpts: Required) { +// if (allOpts.settings) { +// const GovernorSettings = { +// name: 'GovernorSettings', +// path: '@openzeppelin/contracts/governance/extensions/GovernorSettings.sol', +// }; +// c.addParent( +// GovernorSettings, +// [ +// getVotingDelay(allOpts), +// getVotingPeriod(allOpts), +// { lit: getProposalThreshold(allOpts) }, +// ], +// ); +// c.addOverride(GovernorSettings, functions.votingDelay, 'view'); +// c.addOverride(GovernorSettings, functions.votingPeriod, 'view'); +// c.addOverride(GovernorSettings, functions.proposalThreshold, 'view'); +// } else { +// setVotingParameters(c, allOpts); +// setProposalThreshold(c, allOpts); +// } +// } + +// function getVotingDelay(opts: Required): { lit: string } | { note: string, value: number } { +// try { +// if (opts.clockMode === 'timestamp') { +// return { +// lit: durationToTimestamp(opts.delay), +// }; +// } else { +// return { +// value: durationToBlocks(opts.delay, opts.blockTime), +// note: opts.delay +// }; +// } +// } catch (e) { +// if (e instanceof Error) { +// throw new OptionsError({ +// delay: e.message, +// }); +// } else { +// throw e; +// } +// } +// } + +// function getVotingPeriod(opts: Required): { lit: string } | { note: string, value: number } { +// try { +// if (opts.clockMode === 'timestamp') { +// return { +// lit: durationToTimestamp(opts.period), +// }; +// } else { +// return { +// value: durationToBlocks(opts.period, opts.blockTime), +// note: opts.period +// }; +// } +// } catch (e) { +// if (e instanceof Error) { +// throw new OptionsError({ +// period: e.message, +// }); +// } else { +// throw e; +// } +// } +// } + +// function validateDecimals(decimals: number) { +// if (!/^\d+$/.test(decimals.toString())) { +// throw new OptionsError({ +// decimals: 'Not a valid number', +// }); +// } +// } + +// function getProposalThreshold({ proposalThreshold, decimals, votes }: Required): string { +// if (!/^\d+$/.test(proposalThreshold)) { +// throw new OptionsError({ +// proposalThreshold: 'Not a valid number', +// }); +// } + +// if (/^0+$/.test(proposalThreshold) || decimals === 0 || votes === 'erc721votes') { +// return proposalThreshold; +// } else { +// return `${proposalThreshold}e${decimals}`; +// } +// } + +// function setVotingParameters(c: ContractBuilder, opts: Required) { +// const delayBlocks = getVotingDelay(opts); +// if ('lit' in delayBlocks) { +// c.setFunctionBody([`return ${delayBlocks.lit};`], functions.votingDelay); +// } else { +// c.setFunctionBody([`return ${delayBlocks.value}; // ${delayBlocks.note}`], functions.votingDelay); +// } + +// const periodBlocks = getVotingPeriod(opts); +// if ('lit' in periodBlocks) { +// c.setFunctionBody([`return ${periodBlocks.lit};`], functions.votingPeriod); +// } else { +// c.setFunctionBody([`return ${periodBlocks.value}; // ${periodBlocks.note}`], functions.votingPeriod); +// } +// } + +// function setProposalThreshold(c: ContractBuilder, opts: Required) { +// const threshold = getProposalThreshold(opts); +// const nonZeroThreshold = parseInt(threshold) !== 0; + +// if (nonZeroThreshold) { +// c.setFunctionBody([`return ${threshold};`], functions.proposalThreshold); +// } +// } + +// function addCounting(c: ContractBuilder) { +// c.addParent({ +// name: 'GovernorCountingSimple', +// path: '@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol', +// }); +// } + +// function addVotes(c: ContractBuilder) { +// const tokenArg = '_token'; + +// c.addImportOnly({ +// name: 'IVotes', +// path: `@openzeppelin/contracts/governance/utils/IVotes.sol`, +// transpiled: false, +// }); +// c.addConstructorArgument({ +// type: { +// name: 'IVotes', +// transpiled: false, +// }, +// name: tokenArg, +// }); + +// c.addParent({ +// name: 'GovernorVotes', +// path: `@openzeppelin/contracts/governance/extensions/GovernorVotes.sol`, +// }, [{ lit: tokenArg }]); +// } + +// export const numberPattern = /^(?!$)(\d*)(?:\.(\d+))?(?:e(\d+))?$/; + +// function addQuorum(c: ContractBuilder, opts: Required) { +// if (opts.quorumMode === 'percent') { +// if (opts.quorumPercent > 100) { +// throw new OptionsError({ +// quorumPercent: 'Invalid percentage', +// }); +// } + +// let { quorumFractionNumerator, quorumFractionDenominator } = getQuorumFractionComponents(opts.quorumPercent); + +// const GovernorVotesQuorumFraction = { +// name: 'GovernorVotesQuorumFraction', +// path: '@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol', +// }; + +// if (quorumFractionDenominator !== undefined) { +// c.addOverride(GovernorVotesQuorumFraction, functions.quorumDenominator); +// c.setFunctionBody([ +// `return ${quorumFractionDenominator};` +// ], functions.quorumDenominator, 'pure'); +// } + +// c.addParent(GovernorVotesQuorumFraction, [quorumFractionNumerator]); +// c.addOverride(GovernorVotesQuorumFraction, functions.quorum); +// } + +// else if (opts.quorumMode === 'absolute') { +// if (!numberPattern.test(opts.quorumAbsolute)) { +// throw new OptionsError({ +// quorumAbsolute: 'Not a valid number', +// }); +// } + +// let returnStatement = (opts.decimals === 0 || opts.votes === 'erc721votes') ? +// `return ${opts.quorumAbsolute};` : +// `return ${opts.quorumAbsolute}e${opts.decimals};`; + +// c.setFunctionBody([ +// returnStatement, +// ], functions.quorum, 'pure'); +// } +// } + +// const timelockModules = { +// openzeppelin: { +// timelockType: { +// name: 'TimelockController', +// path: `@openzeppelin/contracts/governance/TimelockController.sol`, +// }, +// timelockParent: { +// name: 'GovernorTimelockControl', +// path: `@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol`, +// } +// }, +// compound: { +// timelockType: { +// name: 'ICompoundTimelock', +// path: `@openzeppelin/contracts/vendor/compound/ICompoundTimelock.sol`, +// transpiled: false, +// }, +// timelockParent: { +// name: 'GovernorTimelockCompound', +// path: `@openzeppelin/contracts/governance/extensions/GovernorTimelockCompound.sol`, +// } +// }, +// } as const; + +// function getQuorumFractionComponents(quorumPercent: number): {quorumFractionNumerator: number, quorumFractionDenominator: string | undefined} { +// let quorumFractionNumerator = quorumPercent; +// let quorumFractionDenominator = undefined; + +// const quorumPercentSegments = quorumPercent.toString().split("."); +// if (quorumPercentSegments.length > 2) { +// throw new OptionsError({ +// quorumPercent: 'Invalid percentage', +// }); +// } else if (quorumPercentSegments.length == 2 && quorumPercentSegments[0] !== undefined && quorumPercentSegments[1] !== undefined) { +// quorumFractionNumerator = parseInt(quorumPercentSegments[0].concat(quorumPercentSegments[1])); +// const decimals = quorumPercentSegments[1].length; +// quorumFractionDenominator = '100'; +// while (quorumFractionDenominator.length < decimals + 3) { +// quorumFractionDenominator += '0'; +// } +// } +// return { quorumFractionNumerator, quorumFractionDenominator }; +// } + +// function addTimelock(c: ContractBuilder, { timelock }: Required) { +// if (timelock === false) { +// return; +// } + +// const timelockArg = '_timelock'; +// const { timelockType, timelockParent } = timelockModules[timelock]; + +// c.addImportOnly(timelockType); +// c.addConstructorArgument({ +// type: timelockType, +// name: timelockArg, +// }); + +// c.addParent(timelockParent, [{ lit: timelockArg }]); +// c.addOverride(timelockParent, functions._queueOperations); +// c.addOverride(timelockParent, functions._executeOperations); +// c.addOverride(timelockParent, functions._cancel); +// c.addOverride(timelockParent, functions._executor); +// c.addOverride(timelockParent, functions.state); +// c.addOverride(timelockParent, functions.proposalNeedsQueuing); +// } + +// function addStorage(c: ContractBuilder, { storage }: GovernorOptions) { +// if (storage) { +// const GovernorStorage = { +// name: 'GovernorStorage', +// path: '@openzeppelin/contracts/governance/extensions/GovernorStorage.sol', +// }; +// c.addParent(GovernorStorage); +// c.addOverride(GovernorStorage, functions._propose); +// } +// } + +// const functions = defineFunctions({ +// votingDelay: { +// args: [], +// returns: ['uint256'], +// kind: 'public', +// mutability: 'pure', +// }, +// votingPeriod: { +// args: [], +// returns: ['uint256'], +// kind: 'public', +// mutability: 'pure', +// }, +// proposalThreshold: { +// args: [], +// returns: ['uint256'], +// kind: 'public', +// mutability: 'pure', +// }, +// proposalNeedsQueuing: { +// args: [ +// { name: 'proposalId', type: 'uint256' }, +// ], +// returns: ['bool'], +// kind: 'public', +// mutability: 'view', +// }, +// quorum: { +// args: [ +// { name: 'blockNumber', type: 'uint256' }, +// ], +// returns: ['uint256'], +// kind: 'public', +// mutability: 'view', +// }, +// quorumDenominator: { +// args: [], +// returns: ['uint256'], +// kind: 'public', +// mutability: 'view', +// }, +// propose: { +// args: [ +// { name: 'targets', type: 'address[] memory' }, +// { name: 'values', type: 'uint256[] memory' }, +// { name: 'calldatas', type: 'bytes[] memory' }, +// { name: 'description', type: 'string memory' }, +// ], +// returns: ['uint256'], +// kind: 'public', +// }, +// _propose: { +// args: [ +// { name: 'targets', type: 'address[] memory' }, +// { name: 'values', type: 'uint256[] memory' }, +// { name: 'calldatas', type: 'bytes[] memory' }, +// { name: 'description', type: 'string memory' }, +// { name: 'proposer', type: 'address' }, +// ], +// returns: ['uint256'], +// kind: 'internal', +// }, +// _queueOperations: { +// args: [ +// { name: 'proposalId', type: 'uint256' }, +// { name: 'targets', type: 'address[] memory' }, +// { name: 'values', type: 'uint256[] memory' }, +// { name: 'calldatas', type: 'bytes[] memory' }, +// { name: 'descriptionHash', type: 'bytes32' }, +// ], +// kind: 'internal', +// returns: ['uint48'], +// }, +// _executeOperations: { +// args: [ +// { name: 'proposalId', type: 'uint256' }, +// { name: 'targets', type: 'address[] memory' }, +// { name: 'values', type: 'uint256[] memory' }, +// { name: 'calldatas', type: 'bytes[] memory' }, +// { name: 'descriptionHash', type: 'bytes32' }, +// ], +// kind: 'internal', +// }, +// _cancel: { +// args: [ +// { name: 'targets', type: 'address[] memory' }, +// { name: 'values', type: 'uint256[] memory' }, +// { name: 'calldatas', type: 'bytes[] memory' }, +// { name: 'descriptionHash', type: 'bytes32' }, +// ], +// returns: ['uint256'], +// kind: 'internal', +// }, +// state: { +// args: [ +// { name: 'proposalId', type: 'uint256' }, +// ], +// returns: ['ProposalState'], +// kind: 'public', +// mutability: 'view', +// }, +// _executor: { +// args: [], +// returns: ['address'], +// kind: 'internal', +// mutability: 'view', +// }, +// }); diff --git a/packages/core-cairo/src/index.ts b/packages/core-cairo/src/index.ts index 448e90c47..c5c41aa76 100644 --- a/packages/core-cairo/src/index.ts +++ b/packages/core-cairo/src/index.ts @@ -23,4 +23,4 @@ export { sanitizeKind } from './kind'; export { contractsVersion, contractsVersionTag, compatibleContractsSemver } from './utils/version'; -export { erc20, erc721, erc1155, account, custom } from './api'; +export { erc20, erc721, erc1155, account, governor, custom } from './api'; diff --git a/packages/core-cairo/src/kind.ts b/packages/core-cairo/src/kind.ts index 9dcd2710a..0f6ee0683 100644 --- a/packages/core-cairo/src/kind.ts +++ b/packages/core-cairo/src/kind.ts @@ -18,6 +18,7 @@ function isKind(value: Kind | T): value is Kind { case 'ERC721': case 'ERC1155': case 'Account': + case 'Governor': case 'Custom': return true; diff --git a/packages/ui/src/cairo/App.svelte b/packages/ui/src/cairo/App.svelte index ba1956cce..234cd8357 100644 --- a/packages/ui/src/cairo/App.svelte +++ b/packages/ui/src/cairo/App.svelte @@ -8,6 +8,7 @@ import ERC1155Controls from './ERC1155Controls.svelte'; import CustomControls from './CustomControls.svelte'; import AccountControls from './AccountControls.svelte'; + import GovernorControls from './GovernorControls.svelte'; import CopyIcon from '../icons/CopyIcon.svelte'; import CheckIcon from '../icons/CheckIcon.svelte'; import DownloadIcon from '../icons/DownloadIcon.svelte'; @@ -55,6 +56,9 @@ break; case 'Account': break; + case 'Governor': + opts.name = initialOpts.name ?? opts.name; + break; case 'ERC1155': case 'Custom': } @@ -117,6 +121,9 @@ + @@ -165,6 +172,9 @@
+
+ +
diff --git a/packages/ui/src/cairo/GovernorControls.svelte b/packages/ui/src/cairo/GovernorControls.svelte new file mode 100644 index 000000000..8d4a21052 --- /dev/null +++ b/packages/ui/src/cairo/GovernorControls.svelte @@ -0,0 +1,241 @@ + + +
+

Settings

+ + + +
+ + + +
+ + + + + +

+ + Token amounts above will be extended with this number of zeroes. Does not apply to ERC721Votes. +

+ +
+ + + +
+
+ +
+

Votes

+ +
+ + + +
+
+ +
+

+ + +

+ +
+ +

+ + + Assumed block time for converting voting time periods into block numbers. +
+ Block time may drift and impact these periods in the future. +
+

+ + +
+
+ +
+

+ + +

+ +
+ + + +
+
+ + + + From f5716a05b40adff77d53c3210079d0928f753c27 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 4 Dec 2024 14:34:51 +0100 Subject: [PATCH 02/20] fix: controls --- packages/ui/src/cairo/App.svelte | 3 - packages/ui/src/cairo/GovernorControls.svelte | 58 ++++--------------- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/packages/ui/src/cairo/App.svelte b/packages/ui/src/cairo/App.svelte index 234cd8357..274d66591 100644 --- a/packages/ui/src/cairo/App.svelte +++ b/packages/ui/src/cairo/App.svelte @@ -55,10 +55,7 @@ opts.symbol = initialOpts.symbol ?? opts.symbol; break; case 'Account': - break; case 'Governor': - opts.name = initialOpts.name ?? opts.name; - break; case 'ERC1155': case 'Custom': } diff --git a/packages/ui/src/cairo/GovernorControls.svelte b/packages/ui/src/cairo/GovernorControls.svelte index 8d4a21052..136008010 100644 --- a/packages/ui/src/cairo/GovernorControls.svelte +++ b/packages/ui/src/cairo/GovernorControls.svelte @@ -5,9 +5,9 @@ import { governor, infoDefaults } from '@openzeppelin/wizard-cairo'; import ToggleRadio from '../inputs/ToggleRadio.svelte'; - import UpgradeabilitySection from '../UpgradeabilitySection.svelte'; + import UpgradeabilityField from './UpgradeabilityField.svelte'; import InfoSection from './InfoSection.svelte'; - + import { error } from '../error-tooltip'; import { resizeToFit } from '../resize-to-fit'; @@ -48,7 +48,7 @@ disabledDecimals = false; } else if (!wasERC721Votes && opts.votes === 'erc721votes') { previousDecimals = opts.decimals; - opts.decimals = 0; + opts.decimals = 0; disabledDecimals = true; } @@ -123,14 +123,7 @@ Allow governance to update voting settings (delay, period, proposal threshold). - - + @@ -141,7 +134,7 @@ @@ -149,7 +142,7 @@ @@ -164,36 +157,16 @@ The clock mode used by the voting token.
- NOTE: This setting must be the same as what the token uses. + NOTE: This setting must be the same as what the token uses. For now, only timestamp mode is supported.
- -

- - - Assumed block time for converting voting time periods into block numbers. -
- Block time may drift and impact these periods in the future. -
-

- @@ -215,27 +188,16 @@ - +
- -
- - From 8125bdd6942bc9ae417abba6a0073c0e89255776 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 4 Dec 2024 17:33:45 +0100 Subject: [PATCH 03/20] feat: add section and embed to impls --- packages/core-cairo/src/account.ts | 12 +- packages/core-cairo/src/add-pausable.ts | 13 +- packages/core-cairo/src/common-components.ts | 6 +- packages/core-cairo/src/contract.test.ts | 13 +- packages/core-cairo/src/contract.ts | 3 +- packages/core-cairo/src/erc1155.ts | 6 +- packages/core-cairo/src/erc20.ts | 6 +- packages/core-cairo/src/erc721.ts | 20 +- packages/core-cairo/src/governor.ts | 190 +++++++++--------- packages/core-cairo/src/print.ts | 20 +- packages/core-cairo/src/set-access-control.ts | 20 +- packages/core-cairo/src/set-upgradeable.ts | 6 +- packages/core-cairo/src/utils/duration.ts | 26 +++ 13 files changed, 186 insertions(+), 155 deletions(-) create mode 100644 packages/core-cairo/src/utils/duration.ts diff --git a/packages/core-cairo/src/account.ts b/packages/core-cairo/src/account.ts index b5768bcd5..c3a989573 100644 --- a/packages/core-cairo/src/account.ts +++ b/packages/core-cairo/src/account.ts @@ -160,11 +160,11 @@ const components = defineComponents( { name: 'AccountEvent', type: 'AccountComponent::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'AccountInternalImpl', + embed: false, value: 'AccountComponent::InternalImpl', - }, + }], }, EthAccountComponent: { path: 'openzeppelin::account::eth_account', @@ -176,10 +176,10 @@ const components = defineComponents( { name: 'EthAccountEvent', type: 'EthAccountComponent::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'EthAccountInternalImpl', + embed: false, value: 'EthAccountComponent::InternalImpl', - }, + }] }, }); diff --git a/packages/core-cairo/src/add-pausable.ts b/packages/core-cairo/src/add-pausable.ts index a98fe91f1..1e950f98e 100644 --- a/packages/core-cairo/src/add-pausable.ts +++ b/packages/core-cairo/src/add-pausable.ts @@ -25,16 +25,15 @@ const components = defineComponents( { name: 'PausableEvent', type: 'PausableComponent::Event', }, - impls: [ - { + impls: [{ name: 'PausableImpl', value: 'PausableComponent::PausableImpl', - }, + }, { + name: 'PausableInternalImpl', + embed: false, + value: 'PausableComponent::InternalImpl', + } ], - internalImpl: { - name: 'PausableInternalImpl', - value: 'PausableComponent::InternalImpl', - }, }, }); diff --git a/packages/core-cairo/src/common-components.ts b/packages/core-cairo/src/common-components.ts index 207e62125..71c7512ab 100644 --- a/packages/core-cairo/src/common-components.ts +++ b/packages/core-cairo/src/common-components.ts @@ -28,11 +28,11 @@ const components = defineComponents( { name: 'VotesEvent', type: 'VotesComponent::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'VotesInternalImpl', + embed: false, value: 'VotesComponent::InternalImpl', - }, + }], }, NoncesComponent: { diff --git a/packages/core-cairo/src/contract.test.ts b/packages/core-cairo/src/contract.test.ts index 1cc88ba8d..8e08d266c 100644 --- a/packages/core-cairo/src/contract.test.ts +++ b/packages/core-cairo/src/contract.test.ts @@ -14,16 +14,15 @@ const FOO_COMPONENT: Component = { name: 'FooEvent', type: 'FooComponent::Event', }, - impls: [ - { + impls: [{ name: 'FooImpl', value: 'FooComponent::FooImpl', - }, + }, { + name: 'FooInternalImpl', + embed: false, + value: 'FooComponent::InternalImpl', + } ], - internalImpl: { - name: 'FooInternalImpl', - value: 'FooComponent::InternalImpl', - }, }; test('contract basics', t => { diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index fa635d00b..1a13abb65 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -21,7 +21,6 @@ export interface Component { substorage: Substorage; event: Event; impls: Impl[]; - internalImpl?: Impl; initializer?: Initializer; } @@ -38,6 +37,8 @@ export interface Event { export interface Impl { name: string; value: string; + embed?: boolean; + section?: string; } export interface Initializer { diff --git a/packages/core-cairo/src/erc1155.ts b/packages/core-cairo/src/erc1155.ts index bfb421e6a..b6dc38031 100644 --- a/packages/core-cairo/src/erc1155.ts +++ b/packages/core-cairo/src/erc1155.ts @@ -170,11 +170,11 @@ const components = defineComponents( { name: 'ERC1155Event', type: 'ERC1155Component::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'ERC1155InternalImpl', + embed: false, value: 'ERC1155Component::InternalImpl', - }, + }], }, }); diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index 3e13b6119..d9d322187 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -258,11 +258,11 @@ const components = defineComponents( { name: 'ERC20Event', type: 'ERC20Component::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'ERC20InternalImpl', + embed: false, value: 'ERC20Component::InternalImpl', - }, + }], }, }); diff --git a/packages/core-cairo/src/erc721.ts b/packages/core-cairo/src/erc721.ts index 9d0a32c1a..8f6db98d8 100644 --- a/packages/core-cairo/src/erc721.ts +++ b/packages/core-cairo/src/erc721.ts @@ -201,11 +201,11 @@ const components = defineComponents( { name: 'ERC721Event', type: 'ERC721Component::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'ERC721InternalImpl', + embed: false, value: 'ERC721Component::InternalImpl', - }, + }], }, ERC721EnumerableComponent: { path: 'openzeppelin::token::erc721::extensions', @@ -217,16 +217,14 @@ const components = defineComponents( { name: 'ERC721EnumerableEvent', type: 'ERC721EnumerableComponent::Event', }, - impls: [ - { - name: 'ERC721EnumerableImpl', - value: 'ERC721EnumerableComponent::ERC721EnumerableImpl', - }, - ], - internalImpl: { + impls: [{ + name: 'ERC721EnumerableImpl', + value: 'ERC721EnumerableComponent::ERC721EnumerableImpl', + }, { name: 'ERC721EnumerableInternalImpl', + embed: false, value: 'ERC721EnumerableComponent::InternalImpl', - }, + }], }, }); diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 765613bff..8140c207f 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -7,9 +7,8 @@ import { printContract } from "./print"; import { setInfo } from "./set-info"; import { setUpgradeable } from "./set-upgradeable"; import { defineFunctions } from './utils/define-functions'; -// import { durationToBlocks, durationToTimestamp } from "./utils/duration"; import { defineComponents } from './utils/define-components'; - +import { durationToTimestamp } from './utils/duration'; export const clockModeOptions = ['blocknumber', 'timestamp'] as const; export const clockModeDefault = 'timestamp' as const; export type ClockMode = typeof clockModeOptions[number]; @@ -27,7 +26,6 @@ export const defaults: Required = { quorumMode: 'percent', quorumPercent: 4, quorumAbsolute: '', - storage: false, settings: true, access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, @@ -57,7 +55,6 @@ export interface GovernorOptions extends CommonContractOptions { votes?: VotesOptions; clockMode?: ClockMode; timelock?: TimelockOptions; - storage?: boolean; settings?: boolean; } @@ -75,7 +72,6 @@ function withDefaults(opts: GovernorOptions): Required { quorumAbsolute: opts.quorumAbsolute ?? defaults.quorumAbsolute, proposalThreshold: opts.proposalThreshold || defaults.proposalThreshold, settings: opts.settings ?? defaults.settings, - storage: opts.storage ?? defaults.storage, quorumMode: opts.quorumMode ?? defaults.quorumMode, votes: opts.votes ?? defaults.votes, clockMode: opts.clockMode ?? defaults.clockMode, @@ -88,10 +84,10 @@ export function buildGovernor(opts: GovernorOptions): Contract { const c = new ContractBuilder(allOpts.name); - // validateDecimals(allOpts.decimals); + validateDecimals(allOpts.decimals); addBase(c, allOpts); - // addSettings(c, allOpts); + addSettings(c, allOpts); // addCounting(c); // addStorage(c, allOpts); // addVotes(c); @@ -119,104 +115,110 @@ const components = defineComponents( { impls: [{ name: 'GovernorImpl', value: 'GovernorComponent::GovernorImpl', + embed: true, + section: 'Governor Core', }], }, + GovernorSettingsComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'settings', + type: 'GovernorSettings::Storage', + }, + event: { + name: 'GovernorSettingsEvent', + type: 'GovernorSettings::Event', + }, + impls: [{ + name: 'GovernorSettingsAdminImpl', + value: 'GovernorSettingsComponent::GovernorSettingsAdminImpl', + embed: true, + section: 'Extensions (external)', + }, { + name: 'GovernorSettingsImpl', + value: 'GovernorSettingsComponent::GovernorSettings', + embed: false, + section: 'Extensions (internal)', + }], + } }); -function addBase(c: ContractBuilder, { name }: GovernorOptions) { +function addBase(c: ContractBuilder, _: GovernorOptions) { + c.addStandaloneImport('starknet::ContractAddress'); + c.addConstructorArgument({ name: 'votes_token', type: 'ContractAddress' }); c.addComponent(components.GovernorComponent, [], true); } -// function addSettings(c: ContractBuilder, allOpts: Required) { -// if (allOpts.settings) { -// const GovernorSettings = { -// name: 'GovernorSettings', -// path: '@openzeppelin/contracts/governance/extensions/GovernorSettings.sol', -// }; -// c.addParent( -// GovernorSettings, -// [ -// getVotingDelay(allOpts), -// getVotingPeriod(allOpts), -// { lit: getProposalThreshold(allOpts) }, -// ], -// ); -// c.addOverride(GovernorSettings, functions.votingDelay, 'view'); -// c.addOverride(GovernorSettings, functions.votingPeriod, 'view'); -// c.addOverride(GovernorSettings, functions.proposalThreshold, 'view'); -// } else { -// setVotingParameters(c, allOpts); -// setProposalThreshold(c, allOpts); -// } -// } - -// function getVotingDelay(opts: Required): { lit: string } | { note: string, value: number } { -// try { -// if (opts.clockMode === 'timestamp') { -// return { -// lit: durationToTimestamp(opts.delay), -// }; -// } else { -// return { -// value: durationToBlocks(opts.delay, opts.blockTime), -// note: opts.delay -// }; -// } -// } catch (e) { -// if (e instanceof Error) { -// throw new OptionsError({ -// delay: e.message, -// }); -// } else { -// throw e; -// } -// } -// } +function addSettings(c: ContractBuilder, allOpts: Required) { + if (allOpts.settings) { + c.addComponent(components.GovernorSettingsComponent, [ + getVotingDelay(allOpts), + getVotingPeriod(allOpts), + { lit: getProposalThreshold(allOpts) }, + ], true); + } else { + // setVotingParameters(c, allOpts); + // setProposalThreshold(c, allOpts); + } +} -// function getVotingPeriod(opts: Required): { lit: string } | { note: string, value: number } { -// try { -// if (opts.clockMode === 'timestamp') { -// return { -// lit: durationToTimestamp(opts.period), -// }; -// } else { -// return { -// value: durationToBlocks(opts.period, opts.blockTime), -// note: opts.period -// }; -// } -// } catch (e) { -// if (e instanceof Error) { -// throw new OptionsError({ -// period: e.message, -// }); -// } else { -// throw e; -// } -// } -// } +function getVotingDelay(opts: Required): number { + try { + if (opts.clockMode === 'timestamp') { + return durationToTimestamp(opts.delay); + } else { + throw new Error('Invalid clock mode'); + } + } catch (e) { + if (e instanceof Error) { + throw new OptionsError({ + delay: e.message, + }); + } else { + throw e; + } + } +} -// function validateDecimals(decimals: number) { -// if (!/^\d+$/.test(decimals.toString())) { -// throw new OptionsError({ -// decimals: 'Not a valid number', -// }); -// } -// } +function getVotingPeriod(opts: Required): number { + try { + if (opts.clockMode === 'timestamp') { + return durationToTimestamp(opts.period); + } else { + throw new Error('Invalid clock mode'); + } + } catch (e) { + if (e instanceof Error) { + throw new OptionsError({ + period: e.message, + }); + } else { + throw e; + } + } +} -// function getProposalThreshold({ proposalThreshold, decimals, votes }: Required): string { -// if (!/^\d+$/.test(proposalThreshold)) { -// throw new OptionsError({ -// proposalThreshold: 'Not a valid number', -// }); -// } +function validateDecimals(decimals: number) { + if (!/^\d+$/.test(decimals.toString())) { + throw new OptionsError({ + decimals: 'Not a valid number', + }); + } +} -// if (/^0+$/.test(proposalThreshold) || decimals === 0 || votes === 'erc721votes') { -// return proposalThreshold; -// } else { -// return `${proposalThreshold}e${decimals}`; -// } -// } +function getProposalThreshold({ proposalThreshold, decimals, votes }: Required): string { + if (!/^\d+$/.test(proposalThreshold)) { + throw new OptionsError({ + proposalThreshold: 'Not a valid number', + }); + } + + if (/^0+$/.test(proposalThreshold) || decimals === 0 || votes === 'erc721votes') { + return proposalThreshold; + } else { + return `${proposalThreshold}e${decimals}`; // TODO: use the corelib pow function + } +} // function setVotingParameters(c: ContractBuilder, opts: Required) { // const delayBlocks = getVotingDelay(opts); diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 827919a89..d49f8c3f6 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -65,18 +65,26 @@ function printComponentDeclarations(contract: Contract) { } function printImpls(contract: Contract) { - const externalImpls = contract.components.flatMap(c => c.impls); - const internalImpls = contract.components.flatMap(c => c.internalImpl ? [c.internalImpl] : []); + const impls = contract.components.flatMap(c => c.impls); + + let grouped = impls.reduce( + (result:any, current:Impl) => { + let section = current.section ?? 'default'; + (result[section] = result[section] || []).push(current); + return result; + }, {}); + + return spaceBetween( - externalImpls.flatMap(impl => printImpl(impl)), - internalImpls.flatMap(impl => printImpl(impl, true)) + impls.flatMap(impl => printImpl(impl)), ); } -function printImpl(impl: Impl, internal = false) { +function printImpl(impl: Impl) { const lines = []; - if (!internal) { + // embed is optional, default to true + if (impl.embed ?? true) { lines.push('#[abi(embed_v0)]'); } lines.push(`impl ${impl.name} = ${impl.value};`); diff --git a/packages/core-cairo/src/set-access-control.ts b/packages/core-cairo/src/set-access-control.ts index bdaca0f3c..3c0717900 100644 --- a/packages/core-cairo/src/set-access-control.ts +++ b/packages/core-cairo/src/set-access-control.ts @@ -94,16 +94,14 @@ const components = defineComponents( { name: 'OwnableEvent', type: 'OwnableComponent::Event', }, - impls: [ - { - name: 'OwnableMixinImpl', - value: 'OwnableComponent::OwnableMixinImpl', - }, - ], - internalImpl: { + impls: [{ + name: 'OwnableMixinImpl', + value: 'OwnableComponent::OwnableMixinImpl', + }, { name: 'OwnableInternalImpl', + embed: false, value: 'OwnableComponent::InternalImpl', - }, + }], }, AccessControlComponent: { path: 'openzeppelin::access::accesscontrol', @@ -115,10 +113,10 @@ const components = defineComponents( { name: 'AccessControlEvent', type: 'AccessControlComponent::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'AccessControlInternalImpl', + embed: false, value: 'AccessControlComponent::InternalImpl', - }, + }], }, }); diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index 3a94b872b..c67fb5aa4 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -65,11 +65,11 @@ const components = defineComponents( { name: 'UpgradeableEvent', type: 'UpgradeableComponent::Event', }, - impls: [], - internalImpl: { + impls: [{ name: 'UpgradeableInternalImpl', + embed: false, value: 'UpgradeableComponent::InternalImpl', - }, + }], }, }); diff --git a/packages/core-cairo/src/utils/duration.ts b/packages/core-cairo/src/utils/duration.ts new file mode 100644 index 000000000..de24b28c2 --- /dev/null +++ b/packages/core-cairo/src/utils/duration.ts @@ -0,0 +1,26 @@ +const durationUnits = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'] as const; +type DurationUnit = typeof durationUnits[number]; +export const durationPattern = new RegExp(`^(\\d+(?:\\.\\d+)?) +(${durationUnits.join('|')})s?$`); + +const second = 1; +const minute = 60 * second; +const hour = 60 * minute; +const day = 24 * hour; +const week = 7 * day; +const month = 30 * day; +const year = 365 * day; +const secondsForUnit = { second, minute, hour, day, week, month, year }; + +export function durationToTimestamp(duration: string): number { + const match = duration.trim().match(durationPattern); + + if (!match) { + throw new Error('Bad duration format'); + } + + const value = parseFloat(match[1]!); + const unit = match[2]! as DurationUnit; + + const durationSeconds = value * secondsForUnit[unit]; + return Math.round(durationSeconds); +} From d7cf175dc4fcf9aadc0f7b0b28a164a4022fa8e6 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 5 Dec 2024 12:28:09 +0100 Subject: [PATCH 04/20] faet: update print to add section comments in implementations --- packages/core-cairo/src/erc20.ts | 2 +- packages/core-cairo/src/governor.ts | 2 -- packages/core-cairo/src/print.ts | 20 +++++++++++++++----- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index d9d322187..f49684ef9 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -203,7 +203,7 @@ function addPremint(c: ContractBuilder, amount: string) { /** * Calculates the initial supply that would be used in an ERC20 contract based on a given premint amount and number of decimals. - * + * * @param premint Premint amount in token units, may be fractional * @param decimals The number of decimals in the token * @returns `premint` with zeros padded or removed based on `decimals`. diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 8140c207f..4a5b544ae 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -115,7 +115,6 @@ const components = defineComponents( { impls: [{ name: 'GovernorImpl', value: 'GovernorComponent::GovernorImpl', - embed: true, section: 'Governor Core', }], }, @@ -132,7 +131,6 @@ const components = defineComponents( { impls: [{ name: 'GovernorSettingsAdminImpl', value: 'GovernorSettingsComponent::GovernorSettingsAdminImpl', - embed: true, section: 'Extensions (external)', }, { name: 'GovernorSettingsImpl', diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index d49f8c3f6..6376b4378 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -67,18 +67,28 @@ function printComponentDeclarations(contract: Contract) { function printImpls(contract: Contract) { const impls = contract.components.flatMap(c => c.impls); + // group by section let grouped = impls.reduce( (result:any, current:Impl) => { - let section = current.section ?? 'default'; + // default section depends on embed + // embed defaults to true + let embed = current.embed ?? true; + let section = current.section ?? (embed ? 'External' : 'Internal'); (result[section] = result[section] || []).push(current); return result; }, {}); - - - return spaceBetween( - impls.flatMap(impl => printImpl(impl)), + let sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( + ([section, impls]) => printSection(section, impls as Impl[]), ); + return spaceBetween(...sections); +} + +function printSection(section: string, impls: Impl[]) { + const lines = []; + lines.push(`// ${section}`); + impls.map(impl => lines.push(...printImpl(impl))); + return lines; } function printImpl(impl: Impl) { From 4812e6a292aff7e03a1bec42d57327b45b79a9ac Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 5 Dec 2024 13:25:55 +0100 Subject: [PATCH 05/20] feat: add sections to implemented traits --- packages/core-cairo/src/contract.ts | 20 +++++++ packages/core-cairo/src/governor.ts | 91 ++++++++++++++++++++--------- packages/core-cairo/src/print.ts | 75 ++++++++++++++++++++---- 3 files changed, 146 insertions(+), 40 deletions(-) diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index 1a13abb65..10230408d 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -6,6 +6,7 @@ export interface Contract { account: boolean; standaloneImports: string[]; components: Component[]; + constants: Variable[]; constructorCode: string[]; constructorArgs: Argument[]; upgradeable: boolean; @@ -50,6 +51,7 @@ export interface BaseImplementedTrait { of: string; tags: string[]; perItemTag?: string; + section?: string; /** * Priority for which trait to print first. * Lower numbers are higher priority, undefined is lowest priority. @@ -59,6 +61,7 @@ export interface BaseImplementedTrait { export interface ImplementedTrait extends BaseImplementedTrait { functions: ContractFunction[]; + section?: string; } export interface BaseFunction { @@ -77,6 +80,8 @@ export interface Variable { name: string; type: string; value: string; + comment?: string; + inlineComment?: boolean; } export interface Argument { @@ -96,6 +101,7 @@ export class ContractBuilder implements Contract { private componentsMap: Map = new Map(); private implementedTraitsMap: Map = new Map(); private superVariablesMap: Map = new Map(); + private constantsMap: Map = new Map(); private standaloneImportsSet: Set = new Set(); private interfaceFlagsSet: Set = new Set(); @@ -116,6 +122,10 @@ export class ContractBuilder implements Contract { return [...this.superVariablesMap.values()]; } + get constants(): Variable[] { + return [...this.constantsMap.values()]; + } + get standaloneImports(): string[] { return [...this.standaloneImportsSet]; } @@ -154,6 +164,15 @@ export class ContractBuilder implements Contract { } } + addConstant(constant: Variable): boolean { + if (this.constantsMap.has(constant.name)) { + return false; + } else { + this.constantsMap.set(constant.name, constant); + return true; + } + } + addSuperVariable(variable: Variable): boolean { if (this.superVariablesMap.has(variable.name)) { return false; @@ -174,6 +193,7 @@ export class ContractBuilder implements Contract { of: baseTrait.of, tags: [ ...baseTrait.tags ], functions: [], + section: baseTrait.section, priority: baseTrait.priority, }; this.implementedTraitsMap.set(key, t); diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 4a5b544ae..1c0d2617d 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -148,15 +148,34 @@ function addBase(c: ContractBuilder, _: GovernorOptions) { } function addSettings(c: ContractBuilder, allOpts: Required) { + c.addConstant({ + name: 'VOTING_DELAY', + type: 'u64', + value: getVotingDelay(allOpts).toString(), + comment: allOpts.delay, + inlineComment: true, + }); + c.addConstant({ + name: 'VOTING_PERIOD', + type: 'u64', + value: getVotingPeriod(allOpts).toString(), + comment: allOpts.period, + inlineComment: true, + }); + c.addConstant({ + name: 'PROPOSAL_THRESHOLD', + type: 'u256', + value: getProposalThreshold(allOpts), + }); + if (allOpts.settings) { c.addComponent(components.GovernorSettingsComponent, [ - getVotingDelay(allOpts), - getVotingPeriod(allOpts), - { lit: getProposalThreshold(allOpts) }, + { lit: 'VOTING_DELAY' }, + { lit: 'VOTING_PERIOD' }, + { lit: 'PROPOSAL_THRESHOLD' }, ], true); } else { - // setVotingParameters(c, allOpts); - // setProposalThreshold(c, allOpts); + addSettingsLocalImpl(c, allOpts); } } @@ -218,30 +237,46 @@ function getProposalThreshold({ proposalThreshold, decimals, votes }: Required) { -// const delayBlocks = getVotingDelay(opts); -// if ('lit' in delayBlocks) { -// c.setFunctionBody([`return ${delayBlocks.lit};`], functions.votingDelay); -// } else { -// c.setFunctionBody([`return ${delayBlocks.value}; // ${delayBlocks.note}`], functions.votingDelay); -// } - -// const periodBlocks = getVotingPeriod(opts); -// if ('lit' in periodBlocks) { -// c.setFunctionBody([`return ${periodBlocks.lit};`], functions.votingPeriod); -// } else { -// c.setFunctionBody([`return ${periodBlocks.value}; // ${periodBlocks.note}`], functions.votingPeriod); -// } -// } - -// function setProposalThreshold(c: ContractBuilder, opts: Required) { -// const threshold = getProposalThreshold(opts); -// const nonZeroThreshold = parseInt(threshold) !== 0; +function addSettingsLocalImpl(c: ContractBuilder, allOpts: Required) { + const settingsTrait = { + name: 'GovernorSettings', + of: 'GovernorComponent::GovernorSettingsTrait', + tags: [], + section: 'Locally implemented extensions', + priority: 1, + }; + c.addImplementedTrait(settingsTrait); -// if (nonZeroThreshold) { -// c.setFunctionBody([`return ${threshold};`], functions.proposalThreshold); -// } -// } + c.addFunction(settingsTrait, { + name: 'voting_delay', + args: [{ + name: 'self', + type: '@GovernorComponent::ComponentState' + }], + returns: 'u64', + code: ['VOTING_DELAY'], + }); + + c.addFunction(settingsTrait, { + name: 'voting_period', + args: [{ + name: 'self', + type: '@GovernorComponent::ComponentState' + }], + returns: 'u64', + code: ['VOTING_PERIOD'], + }); + + c.addFunction(settingsTrait, { + name: 'proposal_threshold', + args: [{ + name: 'self', + type: '@GovernorComponent::ComponentState' + }], + returns: 'u256', + code: ['PROPOSAL_THRESHOLD'], + }); +} // function addCounting(c: ContractBuilder) { // c.addParent({ diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 6376b4378..b1e86557c 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -1,11 +1,13 @@ import 'array.prototype.flatmap/auto'; -import type { Contract, Component, Argument, Value, Impl, ContractFunction, } from './contract'; +import type { Contract, Component, Argument, Value, Impl, ContractFunction, ImplementedTrait, } from './contract'; import { formatLines, spaceBetween, Lines } from './utils/format-lines'; import { getSelfArg } from './common-options'; import { compatibleContractsSemver } from './utils/version'; +const DEFAULT_SECTION = 'with no section'; + export function printContract(contract: Contract): string { const contractAttribute = contract.account ? '#[starknet::contract(account)]' : '#[starknet::contract]' return formatLines( @@ -20,6 +22,7 @@ export function printContract(contract: Contract): string { `mod ${contract.name} {`, spaceBetween( printImports(contract), + printConstants(contract), printComponentDeclarations(contract), printImpls(contract), printStorage(contract), @@ -56,6 +59,25 @@ function sortImports(contract: Contract) { return allImports.sort(); } +function printConstants(contract: Contract) { + const lines = []; + for (const constant of contract.constants) { + // inlineComment is optional, default to false + let inlineComment = constant.inlineComment ?? false; + let commented = !!constant.comment; + + if (commented && !inlineComment) { + lines.push(`// ${constant.comment}`); + lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); + } else if (commented) { + lines.push(`const ${constant.name}: ${constant.type} = ${constant.value} /* ${constant.comment} */`); + } else { + lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); + } + } + return lines; +} + function printComponentDeclarations(contract: Contract) { const lines = []; for (const component of contract.components) { @@ -134,8 +156,6 @@ function printEvents(contract: Contract) { } function printImplementedTraits(contract: Contract) { - const impls = []; - // sort first by priority, then number of tags, then name const sortedTraits = contract.implementedTraits.sort((a, b) => { if (a.priority !== b.priority) { @@ -147,16 +167,47 @@ function printImplementedTraits(contract: Contract) { return a.name.localeCompare(b.name); }); - for (const trait of sortedTraits) { - const implLines = []; - implLines.push(...trait.tags.map(t => `#[${t}]`)); - implLines.push(`impl ${trait.name} of ${trait.of} {`); - const fns = trait.functions.map(fn => printFunction(fn)); - implLines.push(spaceBetween(...fns)); - implLines.push('}'); - impls.push(implLines); + // group by section + let grouped = sortedTraits.reduce( + (result:any, current:ImplementedTrait) => { + // default to no section + let section = current.section ?? DEFAULT_SECTION; + (result[section] = result[section] || []).push(current); + return result; + }, {}); + + let sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( + ([section, impls]) => printImplementedTraitsSection(section, impls as ImplementedTrait[]), + ); + + return spaceBetween(...sections); +} + +function printImplementedTraitsSection(section: string, impls: ImplementedTrait[]) { + const lines = []; + const isDefaultSection = section === DEFAULT_SECTION; + if (!isDefaultSection) { + lines.push('//'); + lines.push(`// ${section}`); + lines.push('//'); } - return spaceBetween(...impls); + impls.forEach((trait, index) => { + if (index > 0 || !isDefaultSection) { + lines.push(''); + } + lines.push(...printImplementedTrait(trait)); + }); + return lines; +} + +function printImplementedTrait(trait: ImplementedTrait) { + const implLines = []; + implLines.push(...trait.tags.map(t => `#[${t}]`)); + implLines.push(`impl ${trait.name} of ${trait.of} {`); + const fns = trait.functions.map(fn => printFunction(fn)); + implLines.push(spaceBetween(...fns)); + implLines.push('}'); + return implLines; } function printFunction(fn: ContractFunction) { From 47cc49651679465a5eeb83d5128904f639f4742a Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 5 Dec 2024 14:36:49 +0100 Subject: [PATCH 06/20] feat: add quorum --- packages/core-cairo/src/common-components.ts | 10 +- packages/core-cairo/src/governor.ts | 176 +++++++++++------- packages/core-cairo/src/print.ts | 6 +- packages/ui/src/cairo/GovernorControls.svelte | 29 +++ 4 files changed, 149 insertions(+), 72 deletions(-) diff --git a/packages/core-cairo/src/common-components.ts b/packages/core-cairo/src/common-components.ts index 71c7512ab..c774a6d27 100644 --- a/packages/core-cairo/src/common-components.ts +++ b/packages/core-cairo/src/common-components.ts @@ -54,32 +54,38 @@ const components = defineComponents( { }, }) -export function addSRC5Component(c: ContractBuilder) { +export function addSRC5Component(c: ContractBuilder, section?: string) { c.addComponent(components.SRC5Component, [], false); if (!c.interfaceFlags.has('ISRC5')) { c.addImplToComponent(components.SRC5Component, { name: 'SRC5Impl', value: 'SRC5Component::SRC5Impl', + section, }); c.addInterfaceFlag('ISRC5'); } } export function addVotesComponent(c: ContractBuilder, name: string, version: string) { - c.addStandaloneImport('openzeppelin::utils::cryptography::snip12::SNIP12Metadata'); + addSNIP12Metadata(c, name, version); c.addComponent(components.NoncesComponent, [], false); c.addComponent(components.VotesComponent, [], false); c.addImplToComponent(components.VotesComponent, { name: 'VotesImpl', value: `VotesComponent::VotesImpl`, }); +} + +export function addSNIP12Metadata(c: ContractBuilder, name: string, version: string, section?: string) { + c.addStandaloneImport('openzeppelin::utils::cryptography::snip12::SNIP12Metadata'); const SNIP12Metadata: BaseImplementedTrait = { name: 'SNIP12MetadataImpl', of: 'SNIP12Metadata', tags: [], priority: 0, + section, }; c.addImplementedTrait(SNIP12Metadata); diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 1c0d2617d..316741d61 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -9,6 +9,7 @@ import { setUpgradeable } from "./set-upgradeable"; import { defineFunctions } from './utils/define-functions'; import { defineComponents } from './utils/define-components'; import { durationToTimestamp } from './utils/duration'; +import { addSNIP12Metadata, addSRC5Component } from './common-components'; export const clockModeOptions = ['blocknumber', 'timestamp'] as const; export const clockModeDefault = 'timestamp' as const; export type ClockMode = typeof clockModeOptions[number]; @@ -29,6 +30,8 @@ export const defaults: Required = { settings: true, access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, + appName: 'OpenZeppelin Governor', + appVersion: 'v1', info: commonDefaults.info } as const; @@ -56,6 +59,8 @@ export interface GovernorOptions extends CommonContractOptions { clockMode?: ClockMode; timelock?: TimelockOptions; settings?: boolean; + appName?: string; + appVersion?: string; } export function isAccessControlRequired(opts: Partial): boolean { @@ -75,7 +80,9 @@ function withDefaults(opts: GovernorOptions): Required { quorumMode: opts.quorumMode ?? defaults.quorumMode, votes: opts.votes ?? defaults.votes, clockMode: opts.clockMode ?? defaults.clockMode, - timelock: opts.timelock ?? defaults.timelock + timelock: opts.timelock ?? defaults.timelock, + appName: opts.appName ?? defaults.appName, + appVersion: opts.appVersion ?? defaults.appVersion, }; } @@ -87,11 +94,13 @@ export function buildGovernor(opts: GovernorOptions): Contract { validateDecimals(allOpts.decimals); addBase(c, allOpts); + addSRC5Component(c, 'SRC5'); + addSNIP12Metadata(c, allOpts.appName, allOpts.appVersion, 'SNIP12 Metadata'); + addQuorum(c, allOpts); addSettings(c, allOpts); // addCounting(c); // addStorage(c, allOpts); // addVotes(c); - // addQuorum(c, allOpts); // addTimelock(c, allOpts); // setAccessControl(c, allOpts.access); @@ -138,6 +147,32 @@ const components = defineComponents( { embed: false, section: 'Extensions (internal)', }], + }, + GovernorVotesQuorumFractionComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'governor_votes', + type: 'GovernorVotesQuorumFraction::Storage', + }, + event: { + name: 'GovernorVotesEvent', + type: 'GovernorVotesQuorumFraction::Event', + }, + impls: [{ + name: 'GovernorQuorumImpl', + value: 'GovernorVotesQuorumFractionComponent::GovernorQuorum', + embed: false, + section: 'Extensions (internal)', + }, { + name: 'GovernorVotesImpl', + value: 'GovernorVotesQuorumFractionComponent::GovernorVotes', + embed: false, + section: 'Extensions (internal)', + }, { + name: 'QuorumFractionImpl', + value: 'GovernorVotesQuorumFractionComponent::QuorumFractionImpl', + section: 'Extensions (external)', + }], } }); @@ -237,13 +272,13 @@ function getProposalThreshold({ proposalThreshold, decimals, votes }: Required) { +function addSettingsLocalImpl(c: ContractBuilder, _: Required) { const settingsTrait = { name: 'GovernorSettings', of: 'GovernorComponent::GovernorSettingsTrait', tags: [], section: 'Locally implemented extensions', - priority: 1, + priority: 2, }; c.addImplementedTrait(settingsTrait); @@ -278,6 +313,75 @@ function addSettingsLocalImpl(c: ContractBuilder, allOpts: Required) { + if (allOpts.quorumMode === 'percent') { + if (allOpts.quorumPercent > 100) { + throw new OptionsError({ + quorumPercent: 'Invalid percentage', + }); + } + + addQuorumFractionComponent(c, allOpts.quorumPercent); + } + + else if (allOpts.quorumMode === 'absolute') { + if (!numberPattern.test(allOpts.quorumAbsolute)) { + throw new OptionsError({ + quorumAbsolute: 'Not a valid number', + }); + } + + let quorum = (allOpts.decimals === 0 || allOpts.votes === 'erc721votes') ? + `${allOpts.quorumAbsolute}` : + `${allOpts.quorumAbsolute}e${allOpts.decimals}`; // TODO: use the corelib pow function + + addQuorumLocalImpl(c, quorum); + } +} + +function addQuorumFractionComponent(c: ContractBuilder, quorumNumerator: number) { + c.addConstant({ + name: 'QUORUM_NUMERATOR', + type: 'u256', + value: (quorumNumerator * 10).toString(), + comment: `${quorumNumerator}%`, + inlineComment: true, + }); + c.addComponent(components.GovernorVotesQuorumFractionComponent, [ + { lit: 'votes_token' }, + { lit: 'QUORUM_NUMERATOR' }, + ], true); +} + +function addQuorumLocalImpl(c: ContractBuilder, quorum: string) { + c.addConstant({ + name: 'QUORUM', + type: 'u256', + value: quorum, + }); + const quorumTrait = { + name: 'GovernorQuorum', + of: 'GovernorComponent::GovernorQuorumTrait', + tags: [], + section: 'Locally implemented extensions', + priority: 1, + }; + c.addImplementedTrait(quorumTrait); + + c.addFunction(quorumTrait, { + name: 'quorum', + args: [{ + name: 'self', + type: '@GovernorComponent::ComponentState' + }, { + name: 'timepoint', + type: 'u64', + }], + returns: 'u256', + code: ['QUORUM'], + }); +} + // function addCounting(c: ContractBuilder) { // c.addParent({ // name: 'GovernorCountingSimple', @@ -307,50 +411,7 @@ function addSettingsLocalImpl(c: ContractBuilder, allOpts: Required) { -// if (opts.quorumMode === 'percent') { -// if (opts.quorumPercent > 100) { -// throw new OptionsError({ -// quorumPercent: 'Invalid percentage', -// }); -// } - -// let { quorumFractionNumerator, quorumFractionDenominator } = getQuorumFractionComponents(opts.quorumPercent); - -// const GovernorVotesQuorumFraction = { -// name: 'GovernorVotesQuorumFraction', -// path: '@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol', -// }; - -// if (quorumFractionDenominator !== undefined) { -// c.addOverride(GovernorVotesQuorumFraction, functions.quorumDenominator); -// c.setFunctionBody([ -// `return ${quorumFractionDenominator};` -// ], functions.quorumDenominator, 'pure'); -// } - -// c.addParent(GovernorVotesQuorumFraction, [quorumFractionNumerator]); -// c.addOverride(GovernorVotesQuorumFraction, functions.quorum); -// } - -// else if (opts.quorumMode === 'absolute') { -// if (!numberPattern.test(opts.quorumAbsolute)) { -// throw new OptionsError({ -// quorumAbsolute: 'Not a valid number', -// }); -// } - -// let returnStatement = (opts.decimals === 0 || opts.votes === 'erc721votes') ? -// `return ${opts.quorumAbsolute};` : -// `return ${opts.quorumAbsolute}e${opts.decimals};`; - -// c.setFunctionBody([ -// returnStatement, -// ], functions.quorum, 'pure'); -// } -// } +export const numberPattern = /^(?!$)(\d*)(?:\.(\d+))?(?:e(\d+))?$/; // const timelockModules = { // openzeppelin: { @@ -376,25 +437,6 @@ function addSettingsLocalImpl(c: ContractBuilder, allOpts: Required 2) { -// throw new OptionsError({ -// quorumPercent: 'Invalid percentage', -// }); -// } else if (quorumPercentSegments.length == 2 && quorumPercentSegments[0] !== undefined && quorumPercentSegments[1] !== undefined) { -// quorumFractionNumerator = parseInt(quorumPercentSegments[0].concat(quorumPercentSegments[1])); -// const decimals = quorumPercentSegments[1].length; -// quorumFractionDenominator = '100'; -// while (quorumFractionDenominator.length < decimals + 3) { -// quorumFractionDenominator += '0'; -// } -// } -// return { quorumFractionNumerator, quorumFractionDenominator }; -// } // function addTimelock(c: ContractBuilder, { timelock }: Required) { // if (timelock === false) { diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index cf9d98683..5247b15a0 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -6,7 +6,7 @@ import { formatLines, spaceBetween, Lines } from './utils/format-lines'; import { getSelfArg } from './common-options'; import { compatibleContractsSemver } from './utils/version'; -const DEFAULT_SECTION = 'with no section'; +const DEFAULT_SECTION = '1. with no section'; export function printContract(contract: Contract): string { const contractAttribute = contract.account ? '#[starknet::contract(account)]' : '#[starknet::contract]' @@ -73,7 +73,7 @@ function printConstants(contract: Contract) { lines.push(`// ${constant.comment}`); lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); } else if (commented) { - lines.push(`const ${constant.name}: ${constant.type} = ${constant.value} /* ${constant.comment} */`); + lines.push(`const ${constant.name}: ${constant.type} = ${constant.value}; /* ${constant.comment} */`); } else { lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); } @@ -212,7 +212,7 @@ function printImplementedTrait(trait: ImplementedTrait) { trait.superVariables.map(v => `const ${v.name}: ${v.type} = ${v.value}`) ); implLines.push(superVars); - + const fns = trait.functions.map(fn => printFunction(fn)); implLines.push(spaceBetween(...fns)); implLines.push('}'); diff --git a/packages/ui/src/cairo/GovernorControls.svelte b/packages/ui/src/cairo/GovernorControls.svelte index 136008010..534f1e803 100644 --- a/packages/ui/src/cairo/GovernorControls.svelte +++ b/packages/ui/src/cairo/GovernorControls.svelte @@ -200,4 +200,33 @@
+ +
+

+ + +

+ + + + +
+ From a520cec8de90ef5e84f883cda65428dc0cb6968e Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 5 Dec 2024 15:21:57 +0100 Subject: [PATCH 07/20] feat: finish main logic --- packages/core-cairo/src/governor.ts | 329 +++++++----------- packages/core-cairo/src/print.ts | 4 +- packages/core-cairo/src/set-upgradeable.ts | 7 + packages/ui/src/cairo/GovernorControls.svelte | 1 - 4 files changed, 126 insertions(+), 215 deletions(-) diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 316741d61..5b491695d 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -5,7 +5,7 @@ import { OptionsError } from "./error"; import { setAccessControl } from "./set-access-control"; import { printContract } from "./print"; import { setInfo } from "./set-info"; -import { setUpgradeable } from "./set-upgradeable"; +import { setUpgradeableGovernor } from "./set-upgradeable"; import { defineFunctions } from './utils/define-functions'; import { defineComponents } from './utils/define-components'; import { durationToTimestamp } from './utils/duration'; @@ -96,16 +96,16 @@ export function buildGovernor(opts: GovernorOptions): Contract { addBase(c, allOpts); addSRC5Component(c, 'SRC5'); addSNIP12Metadata(c, allOpts.appName, allOpts.appVersion, 'SNIP12 Metadata'); - addQuorum(c, allOpts); + addCounting(c, allOpts); + addQuorumAndVotes(c, allOpts); addSettings(c, allOpts); - // addCounting(c); - // addStorage(c, allOpts); + addExecution(c, allOpts); // addVotes(c); // addTimelock(c, allOpts); // setAccessControl(c, allOpts.access); - // setUpgradeable(c, allOpts.upgradeable, allOpts.access); - // setInfo(c, allOpts.info); + setUpgradeableGovernor(c, allOpts.upgradeable, allOpts.access); + setInfo(c, allOpts.info); return c; } @@ -130,12 +130,12 @@ const components = defineComponents( { GovernorSettingsComponent: { path: 'openzeppelin::governance::governor::extensions', substorage: { - name: 'settings', - type: 'GovernorSettings::Storage', + name: 'governor_settings', + type: 'GovernorSettingsComponent::Storage', }, event: { name: 'GovernorSettingsEvent', - type: 'GovernorSettings::Event', + type: 'GovernorSettingsComponent::Event', }, impls: [{ name: 'GovernorSettingsAdminImpl', @@ -148,15 +148,36 @@ const components = defineComponents( { section: 'Extensions (internal)', }], }, + GovernorVotesComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'governor_votes', + type: 'GovernorVotesComponent::Storage', + }, + event: { + name: 'GovernorVotesEvent', + type: 'GovernorVotesComponent::Event', + }, + impls: [{ + name: 'VotesTokenImpl', + value: 'GovernorVotesComponent::VotesTokenImpl', + section: 'Extensions (external)', + }, { + name: 'GovernorVotesImpl', + value: 'GovernorVotesComponent::GovernorVotes', + embed: false, + section: 'Extensions (internal)', + }], + }, GovernorVotesQuorumFractionComponent: { path: 'openzeppelin::governance::governor::extensions', substorage: { name: 'governor_votes', - type: 'GovernorVotesQuorumFraction::Storage', + type: 'GovernorVotesQuorumFractionComponent::Storage', }, event: { name: 'GovernorVotesEvent', - type: 'GovernorVotesQuorumFraction::Event', + type: 'GovernorVotesQuorumFractionComponent::Event', }, impls: [{ name: 'GovernorQuorumImpl', @@ -173,12 +194,68 @@ const components = defineComponents( { value: 'GovernorVotesQuorumFractionComponent::QuorumFractionImpl', section: 'Extensions (external)', }], - } + }, + GovernorCountingSimpleComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'governor_counting', + type: 'GovernorCountingSimpleComponent::Storage', + }, + event: { + name: 'GovernorCountingSimpleEvent', + type: 'GovernorCountingSimpleComponent::Event', + }, + impls: [{ + name: 'GovernorCountingSimpleImpl', + value: 'GovernorCountingSimpleComponent::GovernorCounting', + embed: false, + section: 'Extensions (internal)', + }], + }, + GovernorCoreExecutionComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'governor_execution', + type: 'GovernorCoreExecutionComponent::Storage', + }, + event: { + name: 'GovernorCoreExecutionEvent', + type: 'GovernorCoreExecutionComponent::Event', + }, + impls: [{ + name: 'GovernorCoreExecutionImpl', + value: 'GovernorCoreExecutionComponent::GovernorExecution', + embed: false, + section: 'Extensions (internal)', + }], + }, + GovernorTimelockExecutionComponent: { + path: 'openzeppelin::governance::governor::extensions', + substorage: { + name: 'governor_timelock_execution', + type: 'GovernorTimelockExecutionComponent::Storage', + }, + event: { + name: 'GovernorTimelockExecutionEvent', + type: 'GovernorTimelockExecutionComponent::Event', + }, + impls: [{ + name: 'TimelockedImpl', + value: 'GovernorTimelockExecutionComponent::TimelockedImpl', + section: 'Extensions (external)', + }, { + name: 'GovernorTimelockExecutionImpl', + value: 'GovernorTimelockExecutionComponent::GovernorExecution', + embed: false, + section: 'Extensions (internal)', + }], + }, }); function addBase(c: ContractBuilder, _: GovernorOptions) { c.addStandaloneImport('starknet::ContractAddress'); c.addConstructorArgument({ name: 'votes_token', type: 'ContractAddress' }); + c.addStandaloneImport('openzeppelin::governance::governor::GovernorComponent::InternalTrait as GovernorInternalTrait'); c.addComponent(components.GovernorComponent, [], true); } @@ -204,6 +281,7 @@ function addSettings(c: ContractBuilder, allOpts: Required) { }); if (allOpts.settings) { + c.addStandaloneImport('openzeppelin::governance::governor::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait'); c.addComponent(components.GovernorSettingsComponent, [ { lit: 'VOTING_DELAY' }, { lit: 'VOTING_PERIOD' }, @@ -313,7 +391,7 @@ function addSettingsLocalImpl(c: ContractBuilder, _: Required) }); } -function addQuorum(c: ContractBuilder, allOpts: Required) { +function addQuorumAndVotes(c: ContractBuilder, allOpts: Required) { if (allOpts.quorumMode === 'percent') { if (allOpts.quorumPercent > 100) { throw new OptionsError({ @@ -321,9 +399,8 @@ function addQuorum(c: ContractBuilder, allOpts: Required) { }); } - addQuorumFractionComponent(c, allOpts.quorumPercent); + addVotesQuorumFractionComponent(c, allOpts.quorumPercent); } - else if (allOpts.quorumMode === 'absolute') { if (!numberPattern.test(allOpts.quorumAbsolute)) { throw new OptionsError({ @@ -335,11 +412,12 @@ function addQuorum(c: ContractBuilder, allOpts: Required) { `${allOpts.quorumAbsolute}` : `${allOpts.quorumAbsolute}e${allOpts.decimals}`; // TODO: use the corelib pow function + addVotesComponent(c, allOpts); addQuorumLocalImpl(c, quorum); } } -function addQuorumFractionComponent(c: ContractBuilder, quorumNumerator: number) { +function addVotesQuorumFractionComponent(c: ContractBuilder, quorumNumerator: number) { c.addConstant({ name: 'QUORUM_NUMERATOR', type: 'u256', @@ -347,12 +425,20 @@ function addQuorumFractionComponent(c: ContractBuilder, quorumNumerator: number) comment: `${quorumNumerator}%`, inlineComment: true, }); + c.addStandaloneImport('openzeppelin::governance::governor::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait'); c.addComponent(components.GovernorVotesQuorumFractionComponent, [ { lit: 'votes_token' }, { lit: 'QUORUM_NUMERATOR' }, ], true); } +function addVotesComponent(c: ContractBuilder, _: Required) { + c.addStandaloneImport('openzeppelin::governance::governor::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait'); + c.addComponent(components.GovernorVotesComponent, [ + { lit: 'votes_token' }, + ], true); +} + function addQuorumLocalImpl(c: ContractBuilder, quorum: string) { c.addConstant({ name: 'QUORUM', @@ -382,201 +468,20 @@ function addQuorumLocalImpl(c: ContractBuilder, quorum: string) { }); } -// function addCounting(c: ContractBuilder) { -// c.addParent({ -// name: 'GovernorCountingSimple', -// path: '@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol', -// }); -// } - -// function addVotes(c: ContractBuilder) { -// const tokenArg = '_token'; - -// c.addImportOnly({ -// name: 'IVotes', -// path: `@openzeppelin/contracts/governance/utils/IVotes.sol`, -// transpiled: false, -// }); -// c.addConstructorArgument({ -// type: { -// name: 'IVotes', -// transpiled: false, -// }, -// name: tokenArg, -// }); - -// c.addParent({ -// name: 'GovernorVotes', -// path: `@openzeppelin/contracts/governance/extensions/GovernorVotes.sol`, -// }, [{ lit: tokenArg }]); -// } +function addCounting(c: ContractBuilder, _: Required) { + c.addComponent(components.GovernorCountingSimpleComponent, [], false); +} -export const numberPattern = /^(?!$)(\d*)(?:\.(\d+))?(?:e(\d+))?$/; +function addExecution(c: ContractBuilder, { timelock }: Required) { + if (timelock === false) { + c.addComponent(components.GovernorCoreExecutionComponent, [], false); + } else { + c.addConstructorArgument({ name: 'timelock_controller', type: 'ContractAddress' }); + c.addStandaloneImport('openzeppelin::governance::governor::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait'); + c.addComponent(components.GovernorTimelockExecutionComponent, [ + { lit: 'timelock_controller' }, + ], true); + } +} -// const timelockModules = { -// openzeppelin: { -// timelockType: { -// name: 'TimelockController', -// path: `@openzeppelin/contracts/governance/TimelockController.sol`, -// }, -// timelockParent: { -// name: 'GovernorTimelockControl', -// path: `@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol`, -// } -// }, -// compound: { -// timelockType: { -// name: 'ICompoundTimelock', -// path: `@openzeppelin/contracts/vendor/compound/ICompoundTimelock.sol`, -// transpiled: false, -// }, -// timelockParent: { -// name: 'GovernorTimelockCompound', -// path: `@openzeppelin/contracts/governance/extensions/GovernorTimelockCompound.sol`, -// } -// }, -// } as const; - - -// function addTimelock(c: ContractBuilder, { timelock }: Required) { -// if (timelock === false) { -// return; -// } - -// const timelockArg = '_timelock'; -// const { timelockType, timelockParent } = timelockModules[timelock]; - -// c.addImportOnly(timelockType); -// c.addConstructorArgument({ -// type: timelockType, -// name: timelockArg, -// }); - -// c.addParent(timelockParent, [{ lit: timelockArg }]); -// c.addOverride(timelockParent, functions._queueOperations); -// c.addOverride(timelockParent, functions._executeOperations); -// c.addOverride(timelockParent, functions._cancel); -// c.addOverride(timelockParent, functions._executor); -// c.addOverride(timelockParent, functions.state); -// c.addOverride(timelockParent, functions.proposalNeedsQueuing); -// } - -// function addStorage(c: ContractBuilder, { storage }: GovernorOptions) { -// if (storage) { -// const GovernorStorage = { -// name: 'GovernorStorage', -// path: '@openzeppelin/contracts/governance/extensions/GovernorStorage.sol', -// }; -// c.addParent(GovernorStorage); -// c.addOverride(GovernorStorage, functions._propose); -// } -// } - -// const functions = defineFunctions({ -// votingDelay: { -// args: [], -// returns: ['uint256'], -// kind: 'public', -// mutability: 'pure', -// }, -// votingPeriod: { -// args: [], -// returns: ['uint256'], -// kind: 'public', -// mutability: 'pure', -// }, -// proposalThreshold: { -// args: [], -// returns: ['uint256'], -// kind: 'public', -// mutability: 'pure', -// }, -// proposalNeedsQueuing: { -// args: [ -// { name: 'proposalId', type: 'uint256' }, -// ], -// returns: ['bool'], -// kind: 'public', -// mutability: 'view', -// }, -// quorum: { -// args: [ -// { name: 'blockNumber', type: 'uint256' }, -// ], -// returns: ['uint256'], -// kind: 'public', -// mutability: 'view', -// }, -// quorumDenominator: { -// args: [], -// returns: ['uint256'], -// kind: 'public', -// mutability: 'view', -// }, -// propose: { -// args: [ -// { name: 'targets', type: 'address[] memory' }, -// { name: 'values', type: 'uint256[] memory' }, -// { name: 'calldatas', type: 'bytes[] memory' }, -// { name: 'description', type: 'string memory' }, -// ], -// returns: ['uint256'], -// kind: 'public', -// }, -// _propose: { -// args: [ -// { name: 'targets', type: 'address[] memory' }, -// { name: 'values', type: 'uint256[] memory' }, -// { name: 'calldatas', type: 'bytes[] memory' }, -// { name: 'description', type: 'string memory' }, -// { name: 'proposer', type: 'address' }, -// ], -// returns: ['uint256'], -// kind: 'internal', -// }, -// _queueOperations: { -// args: [ -// { name: 'proposalId', type: 'uint256' }, -// { name: 'targets', type: 'address[] memory' }, -// { name: 'values', type: 'uint256[] memory' }, -// { name: 'calldatas', type: 'bytes[] memory' }, -// { name: 'descriptionHash', type: 'bytes32' }, -// ], -// kind: 'internal', -// returns: ['uint48'], -// }, -// _executeOperations: { -// args: [ -// { name: 'proposalId', type: 'uint256' }, -// { name: 'targets', type: 'address[] memory' }, -// { name: 'values', type: 'uint256[] memory' }, -// { name: 'calldatas', type: 'bytes[] memory' }, -// { name: 'descriptionHash', type: 'bytes32' }, -// ], -// kind: 'internal', -// }, -// _cancel: { -// args: [ -// { name: 'targets', type: 'address[] memory' }, -// { name: 'values', type: 'uint256[] memory' }, -// { name: 'calldatas', type: 'bytes[] memory' }, -// { name: 'descriptionHash', type: 'bytes32' }, -// ], -// returns: ['uint256'], -// kind: 'internal', -// }, -// state: { -// args: [ -// { name: 'proposalId', type: 'uint256' }, -// ], -// returns: ['ProposalState'], -// kind: 'public', -// mutability: 'view', -// }, -// _executor: { -// args: [], -// returns: ['address'], -// kind: 'internal', -// mutability: 'view', -// }, -// }); +export const numberPattern = /^(?!$)(\d*)(?:\.(\d+))?(?:e(\d+))?$/; diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 5247b15a0..4eb3d4081 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -240,9 +240,9 @@ function printFunction(fn: ContractFunction): Lines[] { } function printConstructor(contract: Contract): Lines[] { - const hasParentParams = contract.components.some(p => p.initializer !== undefined && p.initializer.params.length > 0); + const hasInitializers = contract.components.some(p => p.initializer !== undefined); const hasConstructorCode = contract.constructorCode.length > 0; - if (hasParentParams || hasConstructorCode) { + if (hasInitializers || hasConstructorCode) { const parents = contract.components .filter(hasInitializer) .flatMap(p => printParentConstructor(p)); diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index 4389c4c08..d38e7713d 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -40,6 +40,13 @@ export function setUpgradeable(c: ContractBuilder, upgradeable: Upgradeable, acc } } +export function setUpgradeableGovernor(c: ContractBuilder, upgradeable: Upgradeable): void { + const trait = setUpgradeableBase(c, upgradeable); + if (trait !== undefined) { + c.addFunctionCodeBefore(trait, functions.upgrade, 'self.governor.assert_only_governance()'); + } +} + export function setAccountUpgradeable(c: ContractBuilder, upgradeable: Upgradeable, type: Account): void { const trait = setUpgradeableBase(c, upgradeable); if (trait !== undefined) { diff --git a/packages/ui/src/cairo/GovernorControls.svelte b/packages/ui/src/cairo/GovernorControls.svelte index 534f1e803..8dcf9995d 100644 --- a/packages/ui/src/cairo/GovernorControls.svelte +++ b/packages/ui/src/cairo/GovernorControls.svelte @@ -200,7 +200,6 @@ -

From e764abb7e696530781b4860aadc07a8da3b34f05 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 5 Dec 2024 15:25:44 +0100 Subject: [PATCH 08/20] feat: remove unused imports --- packages/core-cairo/src/governor.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 5b491695d..284348445 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -1,12 +1,10 @@ import { contractDefaults as commonDefaults, withCommonContractDefaults } from './common-options'; -import { CommonContractOptions } from './common-options'; -import { ContractBuilder, Contract, Value } from "./contract"; +import type { CommonContractOptions } from './common-options'; +import { ContractBuilder, Contract } from "./contract"; import { OptionsError } from "./error"; -import { setAccessControl } from "./set-access-control"; import { printContract } from "./print"; import { setInfo } from "./set-info"; import { setUpgradeableGovernor } from "./set-upgradeable"; -import { defineFunctions } from './utils/define-functions'; import { defineComponents } from './utils/define-components'; import { durationToTimestamp } from './utils/duration'; import { addSNIP12Metadata, addSRC5Component } from './common-components'; @@ -104,7 +102,7 @@ export function buildGovernor(opts: GovernorOptions): Contract { // addTimelock(c, allOpts); // setAccessControl(c, allOpts.access); - setUpgradeableGovernor(c, allOpts.upgradeable, allOpts.access); + setUpgradeableGovernor(c, allOpts.upgradeable); setInfo(c, allOpts.info); return c; From 1f65c95c174b4aeb6a44496f171e42d8b3cb33a2 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Tue, 10 Dec 2024 13:21:17 +0100 Subject: [PATCH 09/20] feat: apply review updates --- packages/core-cairo/src/common-components.ts | 4 +- packages/core-cairo/src/erc20.ts | 7 ++- packages/core-cairo/src/erc721.ts | 7 ++- packages/core-cairo/src/governor.ts | 57 ++++++++++---------- packages/core-cairo/src/print.ts | 23 ++++---- packages/core-cairo/src/set-upgradeable.ts | 3 +- 6 files changed, 53 insertions(+), 48 deletions(-) diff --git a/packages/core-cairo/src/common-components.ts b/packages/core-cairo/src/common-components.ts index c774a6d27..93dbd72ee 100644 --- a/packages/core-cairo/src/common-components.ts +++ b/packages/core-cairo/src/common-components.ts @@ -67,8 +67,8 @@ export function addSRC5Component(c: ContractBuilder, section?: string) { } } -export function addVotesComponent(c: ContractBuilder, name: string, version: string) { - addSNIP12Metadata(c, name, version); +export function addVotesComponent(c: ContractBuilder, name: string, version: string, section?: string) { + addSNIP12Metadata(c, name, version, section); c.addComponent(components.NoncesComponent, [], false); c.addComponent(components.VotesComponent, [], false); c.addImplToComponent(components.VotesComponent, { diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index 8ac03f05a..d39f9d0ee 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -138,7 +138,12 @@ function addHooks(c: ContractBuilder, allOpts: Required) { }); } - addVotesComponent(c, toFelt252(allOpts.appName, 'appName'), toFelt252(allOpts.appVersion, 'appVersion')); + addVotesComponent( + c, + toFelt252(allOpts.appName, 'appName'), + toFelt252(allOpts.appVersion, 'appVersion'), + 'SNIP12 Metadata', + ); const afterUpdateFn = c.addFunction(hooksTrait, { name: 'after_update', diff --git a/packages/core-cairo/src/erc721.ts b/packages/core-cairo/src/erc721.ts index 4c90ba640..28fddac51 100644 --- a/packages/core-cairo/src/erc721.ts +++ b/packages/core-cairo/src/erc721.ts @@ -139,7 +139,12 @@ function addHooks(c: ContractBuilder, opts: Required) { }); } - addVotesComponent(c, toFelt252(opts.appName, 'appName'), toFelt252(opts.appVersion, 'appVersion')); + addVotesComponent( + c, + toFelt252(opts.appName, 'appName'), + toFelt252(opts.appVersion, 'appVersion'), + 'SNIP12 Metadata', + ); beforeUpdateCode.push('let previous_owner = self._owner_of(token_id);'); beforeUpdateCode.push('contract_state.votes.transfer_voting_units(previous_owner, to, 1);'); } diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 284348445..96b4b9bc2 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -8,10 +8,14 @@ import { setUpgradeableGovernor } from "./set-upgradeable"; import { defineComponents } from './utils/define-components'; import { durationToTimestamp } from './utils/duration'; import { addSNIP12Metadata, addSRC5Component } from './common-components'; -export const clockModeOptions = ['blocknumber', 'timestamp'] as const; +export const clockModeOptions = ['timestamp'] as const; export const clockModeDefault = 'timestamp' as const; export type ClockMode = typeof clockModeOptions[number]; +const extensionPath = 'openzeppelin::governance::governor::extensions'; +const extensionExternalSection = 'Extensions (external)'; +const extensionInternalSection = 'Extensions (internal)'; + export const defaults: Required = { name: 'MyGovernor', delay: '1 day', @@ -19,7 +23,6 @@ export const defaults: Required = { votes: 'erc20votes', clockMode: clockModeDefault, timelock: 'openzeppelin', - blockTime: 12, decimals: 18, proposalThreshold: '0', quorumMode: 'percent', @@ -42,12 +45,10 @@ export type TimelockOptions = typeof timelockOptions[number]; export function printGovernor(opts: GovernorOptions = defaults): string { return printContract(buildGovernor(opts)); } - export interface GovernorOptions extends CommonContractOptions { name: string; delay: string; period: string; - blockTime?: number; proposalThreshold?: string; decimals?: number; quorumMode?: 'percent' | 'absolute'; @@ -70,7 +71,6 @@ function withDefaults(opts: GovernorOptions): Required { ...opts, ...withCommonContractDefaults(opts), decimals: opts.decimals ?? defaults.decimals, - blockTime: opts.blockTime || defaults.blockTime, quorumPercent: opts.quorumPercent ?? defaults.quorumPercent, quorumAbsolute: opts.quorumAbsolute ?? defaults.quorumAbsolute, proposalThreshold: opts.proposalThreshold || defaults.proposalThreshold, @@ -98,10 +98,6 @@ export function buildGovernor(opts: GovernorOptions): Contract { addQuorumAndVotes(c, allOpts); addSettings(c, allOpts); addExecution(c, allOpts); - // addVotes(c); - // addTimelock(c, allOpts); - - // setAccessControl(c, allOpts.access); setUpgradeableGovernor(c, allOpts.upgradeable); setInfo(c, allOpts.info); @@ -126,7 +122,7 @@ const components = defineComponents( { }], }, GovernorSettingsComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_settings', type: 'GovernorSettingsComponent::Storage', @@ -138,16 +134,16 @@ const components = defineComponents( { impls: [{ name: 'GovernorSettingsAdminImpl', value: 'GovernorSettingsComponent::GovernorSettingsAdminImpl', - section: 'Extensions (external)', + section: extensionExternalSection, }, { name: 'GovernorSettingsImpl', value: 'GovernorSettingsComponent::GovernorSettings', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }], }, GovernorVotesComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_votes', type: 'GovernorVotesComponent::Storage', @@ -159,16 +155,16 @@ const components = defineComponents( { impls: [{ name: 'VotesTokenImpl', value: 'GovernorVotesComponent::VotesTokenImpl', - section: 'Extensions (external)', + section: extensionExternalSection, }, { name: 'GovernorVotesImpl', value: 'GovernorVotesComponent::GovernorVotes', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }], }, GovernorVotesQuorumFractionComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_votes', type: 'GovernorVotesQuorumFractionComponent::Storage', @@ -181,20 +177,20 @@ const components = defineComponents( { name: 'GovernorQuorumImpl', value: 'GovernorVotesQuorumFractionComponent::GovernorQuorum', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }, { name: 'GovernorVotesImpl', value: 'GovernorVotesQuorumFractionComponent::GovernorVotes', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }, { name: 'QuorumFractionImpl', value: 'GovernorVotesQuorumFractionComponent::QuorumFractionImpl', - section: 'Extensions (external)', + section: extensionExternalSection, }], }, GovernorCountingSimpleComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_counting', type: 'GovernorCountingSimpleComponent::Storage', @@ -207,11 +203,11 @@ const components = defineComponents( { name: 'GovernorCountingSimpleImpl', value: 'GovernorCountingSimpleComponent::GovernorCounting', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }], }, GovernorCoreExecutionComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_execution', type: 'GovernorCoreExecutionComponent::Storage', @@ -224,11 +220,11 @@ const components = defineComponents( { name: 'GovernorCoreExecutionImpl', value: 'GovernorCoreExecutionComponent::GovernorExecution', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }], }, GovernorTimelockExecutionComponent: { - path: 'openzeppelin::governance::governor::extensions', + path: extensionPath, substorage: { name: 'governor_timelock_execution', type: 'GovernorTimelockExecutionComponent::Storage', @@ -240,18 +236,19 @@ const components = defineComponents( { impls: [{ name: 'TimelockedImpl', value: 'GovernorTimelockExecutionComponent::TimelockedImpl', - section: 'Extensions (external)', + section: extensionExternalSection, }, { name: 'GovernorTimelockExecutionImpl', value: 'GovernorTimelockExecutionComponent::GovernorExecution', embed: false, - section: 'Extensions (internal)', + section: extensionInternalSection, }], }, }); function addBase(c: ContractBuilder, _: GovernorOptions) { c.addStandaloneImport('starknet::ContractAddress'); + c.addStandaloneImport('openzeppelin::governance::governor::DefaultConfig'); c.addConstructorArgument({ name: 'votes_token', type: 'ContractAddress' }); c.addStandaloneImport('openzeppelin::governance::governor::GovernorComponent::InternalTrait as GovernorInternalTrait'); c.addComponent(components.GovernorComponent, [], true); @@ -279,7 +276,7 @@ function addSettings(c: ContractBuilder, allOpts: Required) { }); if (allOpts.settings) { - c.addStandaloneImport('openzeppelin::governance::governor::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait'); + c.addStandaloneImport(`$${extensionPath}::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait`); c.addComponent(components.GovernorSettingsComponent, [ { lit: 'VOTING_DELAY' }, { lit: 'VOTING_PERIOD' }, @@ -423,7 +420,7 @@ function addVotesQuorumFractionComponent(c: ContractBuilder, quorumNumerator: nu comment: `${quorumNumerator}%`, inlineComment: true, }); - c.addStandaloneImport('openzeppelin::governance::governor::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait'); + c.addStandaloneImport(`${extensionPath}::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait`); c.addComponent(components.GovernorVotesQuorumFractionComponent, [ { lit: 'votes_token' }, { lit: 'QUORUM_NUMERATOR' }, @@ -431,7 +428,7 @@ function addVotesQuorumFractionComponent(c: ContractBuilder, quorumNumerator: nu } function addVotesComponent(c: ContractBuilder, _: Required) { - c.addStandaloneImport('openzeppelin::governance::governor::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait'); + c.addStandaloneImport(`${extensionPath}::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait`); c.addComponent(components.GovernorVotesComponent, [ { lit: 'votes_token' }, ], true); @@ -475,7 +472,7 @@ function addExecution(c: ContractBuilder, { timelock }: Required { + (result: { [section: string]: Impl[] }, current:Impl) => { // default section depends on embed // embed defaults to true let embed = current.embed ?? true; @@ -172,7 +172,7 @@ function printImplementedTraits(contract: Contract): Lines[] { // group by section let grouped = sortedTraits.reduce( - (result:any, current:ImplementedTrait) => { + (result: { [section: string]: ImplementedTrait[] }, current:ImplementedTrait) => { // default to no section let section = current.section ?? DEFAULT_SECTION; (result[section] = result[section] || []).push(current); @@ -186,7 +186,7 @@ function printImplementedTraits(contract: Contract): Lines[] { return spaceBetween(...sections); } -function printImplementedTraitsSection(section: string, impls: ImplementedTrait[]) { +function printImplementedTraitsSection(section: string, impls: ImplementedTrait[]): Lines[] { const lines = []; const isDefaultSection = section === DEFAULT_SECTION; if (!isDefaultSection) { @@ -203,7 +203,7 @@ function printImplementedTraitsSection(section: string, impls: ImplementedTrait[ return lines; } -function printImplementedTrait(trait: ImplementedTrait) { +function printImplementedTrait(trait: ImplementedTrait): Lines[] { const implLines = []; implLines.push(...trait.tags.map(t => `#[${t}]`)); implLines.push(`impl ${trait.name} of ${trait.of} {`); @@ -308,11 +308,11 @@ export function printValue(value: Value): string { // generic for functions and constructors // kindedName = 'fn foo' function printFunction2( - kindedName: string, - args: string[], - tag: string | undefined, - returns: string | undefined, - returnLine: string | undefined, + kindedName: string, + args: string[], + tag: string | undefined, + returns: string | undefined, + returnLine: string | undefined, code: Lines[] ): Lines[] { const fn = []; @@ -343,13 +343,10 @@ function printFunction2( } fn.push(accum); - fn.push(code); - if (returnLine !== undefined) { fn.push([returnLine]); } - fn.push('}'); return fn; diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index d38e7713d..f765b90ca 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -43,7 +43,8 @@ export function setUpgradeable(c: ContractBuilder, upgradeable: Upgradeable, acc export function setUpgradeableGovernor(c: ContractBuilder, upgradeable: Upgradeable): void { const trait = setUpgradeableBase(c, upgradeable); if (trait !== undefined) { - c.addFunctionCodeBefore(trait, functions.upgrade, 'self.governor.assert_only_governance()'); + c.addStandaloneImport('openzeppelin::governance::governor::GovernorComponent::InternalExtendedImpl'); + c.addFunctionCodeBefore(trait, functions.upgrade, 'self.governor.assert_only_governance()'); } } From 152d5f9c25d072e1cf4f4030b8dab4187d53bb8a Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Tue, 10 Dec 2024 14:18:48 +0100 Subject: [PATCH 10/20] feat: refactor imports to use clauses --- packages/core-cairo/src/account.ts | 2 +- packages/core-cairo/src/common-components.ts | 2 +- packages/core-cairo/src/contract.test.ts | 3 +- packages/core-cairo/src/contract.ts | 29 +++++-- packages/core-cairo/src/erc1155.ts | 10 +-- packages/core-cairo/src/erc20.ts | 8 +- packages/core-cairo/src/erc721.ts | 10 +-- packages/core-cairo/src/governor.ts | 14 ++-- packages/core-cairo/src/print.ts | 76 +++++++++++++++---- packages/core-cairo/src/set-access-control.ts | 8 +- packages/core-cairo/src/set-royalty-info.ts | 4 +- packages/core-cairo/src/set-upgradeable.ts | 6 +- 12 files changed, 117 insertions(+), 55 deletions(-) diff --git a/packages/core-cairo/src/account.ts b/packages/core-cairo/src/account.ts index c3a989573..bfbeaca23 100644 --- a/packages/core-cairo/src/account.ts +++ b/packages/core-cairo/src/account.ts @@ -55,7 +55,7 @@ export function buildAccount(opts: AccountOptions): Contract { c.addComponent(components.AccountComponent, [{ lit: 'public_key' }], true); break; case 'eth': - c.addStandaloneImport('openzeppelin::account::interface::EthPublicKey;'); + c.addUseClause('openzeppelin::account::interface', 'EthPublicKey'); c.addConstructorArgument({ name: 'public_key', type: 'EthPublicKey' }); c.addComponent(components.EthAccountComponent, [{ lit: 'public_key' }], true); break; diff --git a/packages/core-cairo/src/common-components.ts b/packages/core-cairo/src/common-components.ts index 93dbd72ee..a05776fdd 100644 --- a/packages/core-cairo/src/common-components.ts +++ b/packages/core-cairo/src/common-components.ts @@ -78,7 +78,7 @@ export function addVotesComponent(c: ContractBuilder, name: string, version: str } export function addSNIP12Metadata(c: ContractBuilder, name: string, version: string, section?: string) { - c.addStandaloneImport('openzeppelin::utils::cryptography::snip12::SNIP12Metadata'); + c.addUseClause('openzeppelin::utils::cryptography::snip12', 'SNIP12Metadata'); const SNIP12Metadata: BaseImplementedTrait = { name: 'SNIP12MetadataImpl', diff --git a/packages/core-cairo/src/contract.test.ts b/packages/core-cairo/src/contract.test.ts index 8e08d266c..b7d040ee0 100644 --- a/packages/core-cairo/src/contract.test.ts +++ b/packages/core-cairo/src/contract.test.ts @@ -106,6 +106,7 @@ test('contract with standalone import', t => { Foo.addComponent( FOO_COMPONENT, ); - Foo.addStandaloneImport('some::library::SomeLibrary'); + Foo.addUseClause('some::library', 'SomeLibrary'); t.snapshot(printContract(Foo)); }); + diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index 3dde42956..3a210515b 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -4,7 +4,7 @@ export interface Contract { license: string; name: string; account: boolean; - standaloneImports: string[]; + useClauses: UseClause[]; components: Component[]; constants: Variable[]; constructorCode: string[]; @@ -16,6 +16,13 @@ export interface Contract { export type Value = string | number | bigint | { lit: string } | { note: string, value: Value }; +export interface UseClause { + containerPath: string; + name: string; + groupable?: boolean; + alias?: string; +} + export interface Component { name: string; path: string; @@ -103,7 +110,7 @@ export class ContractBuilder implements Contract { private implementedTraitsMap: Map = new Map(); private superVariablesMap: Map = new Map(); private constantsMap: Map = new Map(); - private standaloneImportsSet: Set = new Set(); + private useClausesMap: Map = new Map(); private interfaceFlagsSet: Set = new Set(); constructor(name: string, account: boolean = false) { @@ -127,8 +134,8 @@ export class ContractBuilder implements Contract { return [...this.constantsMap.values()]; } - get standaloneImports(): string[] { - return [...this.standaloneImportsSet]; + get useClauses(): UseClause[] { + return [...this.useClausesMap.values()]; } /** @@ -138,11 +145,18 @@ export class ContractBuilder implements Contract { return this.interfaceFlagsSet; } - addStandaloneImport(fullyQualified: string): void { - this.standaloneImportsSet.add(fullyQualified); + addUseClause(containerPath: string, name: string, options?: { groupable?: boolean, alias?: string }): void { + // groupable defaults to true + const groupable = options?.groupable ?? true; + const alias = options?.alias ?? ''; + const present = this.useClausesMap.has(name); + if (!present) { + this.useClausesMap.set(name, { containerPath, name, groupable, alias }); + } } addComponent(component: Component, params: Value[] = [], initializable: boolean = true): boolean { + this.addUseClause(component.path, component.name); const key = component.name; const present = this.componentsMap.has(key); if (!present) { @@ -179,6 +193,7 @@ export class ContractBuilder implements Contract { return false; } else { this.superVariablesMap.set(variable.name, variable); + this.addUseClause('super', variable.name); return true; } } @@ -189,7 +204,7 @@ export class ContractBuilder implements Contract { if (existingTrait !== undefined) { return existingTrait; } else { - const t: ImplementedTrait = { + const t: ImplementedTrait = { name: baseTrait.name, of: baseTrait.of, tags: [ ...baseTrait.tags ], diff --git a/packages/core-cairo/src/erc1155.ts b/packages/core-cairo/src/erc1155.ts index 47d528d63..d17cb8f3c 100644 --- a/packages/core-cairo/src/erc1155.ts +++ b/packages/core-cairo/src/erc1155.ts @@ -100,7 +100,7 @@ function addHooks(c: ContractBuilder, allOpts: Required) { priority: 1, }; c.addImplementedTrait(hooksTrait); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addFunction(hooksTrait, { name: 'before_update', @@ -117,7 +117,7 @@ function addHooks(c: ContractBuilder, allOpts: Required) { ], }); } else { - c.addStandaloneImport('openzeppelin::token::erc1155::ERC1155HooksEmptyImpl'); + c.addUseClause('openzeppelin::token::erc1155', 'ERC1155HooksEmptyImpl'); } } @@ -141,15 +141,15 @@ function addBase(c: ContractBuilder, baseUri: string) { } function addBurnable(c: ContractBuilder) { - c.addStandaloneImport('starknet::ContractAddress'); - c.addStandaloneImport('starknet::get_caller_address'); + c.addUseClause('starknet', 'ContractAddress'); + c.addUseClause('starknet', 'get_caller_address'); c.addFunction(externalTrait, functions.burn); c.addFunction(externalTrait, functions.batch_burn); c.addFunction(externalTrait, functions.batchBurn); } function addMintable(c: ContractBuilder, access: Access) { - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); requireAccessControl(c, externalTrait, functions.mint, access, 'MINTER', 'minter'); requireAccessControl(c, externalTrait, functions.batch_mint, access, 'MINTER', 'minter'); diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index d39f9d0ee..57cfe8d86 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -162,7 +162,7 @@ function addHooks(c: ContractBuilder, allOpts: Required) { ); } } else { - c.addStandaloneImport('openzeppelin::token::erc20::ERC20HooksEmptyImpl'); + c.addUseClause('openzeppelin::token::erc20', 'ERC20HooksEmptyImpl'); } } @@ -184,7 +184,7 @@ function addBase(c: ContractBuilder, name: string, symbol: string) { } function addBurnable(c: ContractBuilder) { - c.addStandaloneImport('starknet::get_caller_address'); + c.addUseClause('starknet', 'get_caller_address'); c.addFunction(externalTrait, functions.burn); } @@ -200,7 +200,7 @@ function addPremint(c: ContractBuilder, amount: string) { const premintAbsolute = toUint(getInitialSupply(amount, 18), 'premint', 'u256'); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addConstructorArgument({ name:'recipient', type:'ContractAddress' }); c.addConstructorCode(`self.erc20.mint(recipient, ${premintAbsolute})`); } @@ -248,7 +248,7 @@ export function getInitialSupply(premint: string, decimals: number): string { } function addMintable(c: ContractBuilder, access: Access) { - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); requireAccessControl(c, externalTrait, functions.mint, access, 'MINTER', 'minter'); } diff --git a/packages/core-cairo/src/erc721.ts b/packages/core-cairo/src/erc721.ts index 28fddac51..6b23e1c28 100644 --- a/packages/core-cairo/src/erc721.ts +++ b/packages/core-cairo/src/erc721.ts @@ -113,7 +113,7 @@ function addHooks(c: ContractBuilder, opts: Required) { priority: 0, }; c.addImplementedTrait(ERC721HooksTrait); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); const requiresMutState = opts.enumerable || opts.votes; const initStateLine = requiresMutState @@ -159,7 +159,7 @@ function addHooks(c: ContractBuilder, opts: Required) { code: beforeUpdateCode, }); } else { - c.addStandaloneImport('openzeppelin::token::erc721::ERC721HooksEmptyImpl'); + c.addUseClause('openzeppelin::token::erc721', 'ERC721HooksEmptyImpl'); } } @@ -187,14 +187,14 @@ function addEnumerable(c: ContractBuilder) { } function addBurnable(c: ContractBuilder) { - c.addStandaloneImport('core::num::traits::Zero'); - c.addStandaloneImport('starknet::get_caller_address'); + c.addUseClause('core::num::traits', 'Zero'); + c.addUseClause('starknet', 'get_caller_address'); c.addFunction(externalTrait, functions.burn); } function addMintable(c: ContractBuilder, access: Access) { - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); requireAccessControl(c, externalTrait, functions.safe_mint, access, 'MINTER', 'minter'); // Camel case version of safe_mint. Access control and pausable are already set on safe_mint. diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index 96b4b9bc2..d56e1162c 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -247,10 +247,10 @@ const components = defineComponents( { }); function addBase(c: ContractBuilder, _: GovernorOptions) { - c.addStandaloneImport('starknet::ContractAddress'); - c.addStandaloneImport('openzeppelin::governance::governor::DefaultConfig'); + c.addUseClause('starknet', 'ContractAddress'); + c.addUseClause('openzeppelin::governance::governor', 'DefaultConfig'); c.addConstructorArgument({ name: 'votes_token', type: 'ContractAddress' }); - c.addStandaloneImport('openzeppelin::governance::governor::GovernorComponent::InternalTrait as GovernorInternalTrait'); + c.addUseClause('openzeppelin::governance::governor::GovernorComponent', 'InternalTrait', { alias: 'GovernorInternalTrait' }); c.addComponent(components.GovernorComponent, [], true); } @@ -276,7 +276,7 @@ function addSettings(c: ContractBuilder, allOpts: Required) { }); if (allOpts.settings) { - c.addStandaloneImport(`$${extensionPath}::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait`); + c.addUseClause(`${extensionPath}::GovernorSettingsComponent`, 'InternalTrait', { alias: 'GovernorSettingsInternalTrait' }); c.addComponent(components.GovernorSettingsComponent, [ { lit: 'VOTING_DELAY' }, { lit: 'VOTING_PERIOD' }, @@ -420,7 +420,7 @@ function addVotesQuorumFractionComponent(c: ContractBuilder, quorumNumerator: nu comment: `${quorumNumerator}%`, inlineComment: true, }); - c.addStandaloneImport(`${extensionPath}::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait`); + c.addUseClause(`${extensionPath}::GovernorVotesQuorumFractionComponent`, 'InternalTrait', { alias: 'GovernorVotesQuorumFractionInternalTrait' }); c.addComponent(components.GovernorVotesQuorumFractionComponent, [ { lit: 'votes_token' }, { lit: 'QUORUM_NUMERATOR' }, @@ -428,7 +428,7 @@ function addVotesQuorumFractionComponent(c: ContractBuilder, quorumNumerator: nu } function addVotesComponent(c: ContractBuilder, _: Required) { - c.addStandaloneImport(`${extensionPath}::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait`); + c.addUseClause(`${extensionPath}::GovernorVotesComponent`, 'InternalTrait', { alias: 'GovernorVotesInternalTrait' }); c.addComponent(components.GovernorVotesComponent, [ { lit: 'votes_token' }, ], true); @@ -472,7 +472,7 @@ function addExecution(c: ContractBuilder, { timelock }: Required `const ${v.name}: ${v.type} = ${v.value}`)); } -function printImports(contract: Contract): string[] { - const lines: string[] = []; - sortImports(contract).forEach(i => lines.push(`use ${i}`)); - return withSemicolons(lines); +function printUseClauses(contract: Contract): Lines[] { + const useClauses = sortUseClauses(contract); + + // group by containerPath + const grouped = useClauses.reduce( + (result: { [containerPath: string]: UseClause[] }, useClause: UseClause) => { + if (useClause.groupable) { + (result[useClause.containerPath] = result[useClause.containerPath] || []).push(useClause); + } else { + (result[STANDALONE_IMPORTS_GROUP] = result[STANDALONE_IMPORTS_GROUP] || []).push(useClause); + } + return result; + }, {}); + + return Object.entries(grouped).flatMap(([groupName, group]) => getLinesFromUseClausesGroup(group, groupName)); } -function sortImports(contract: Contract): string[] { - const componentImports = contract.components.flatMap(c => `${c.path}::${c.name}`); - const allImports = componentImports.concat(contract.standaloneImports); - const superVars = contract.superVariables; - if (superVars.length === 1) { - allImports.push(`super::${superVars[0]!.name}`); - } else if (superVars.length > 1) { - allImports.push(`super::{${superVars.map(v => v.name).join(', ')}}`); +function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lines[] { + const lines = []; + if (groupName === STANDALONE_IMPORTS_GROUP) { + for (const useClause of group) { + let alias = useClause.alias ?? ''; + if (alias.length > 0) { + lines.push(`use ${useClause.containerPath}::${useClause.name} as ${alias};`); + } else { + lines.push(`use ${useClause.containerPath}::${useClause.name};`); + } + } + } else { + if (group.length == 1) { + let alias = group[0]!.alias ?? ''; + if (alias.length > 0) { + lines.push(`use ${groupName}::${group[0]!.name} as ${alias};`); + } else { + lines.push(`use ${groupName}::${group[0]!.name};`); + } + + } else if (group.length > 1) { + let clauses = group.reduce((clauses, useClause) => { + let alias = useClause.alias ?? ''; + if (alias.length > 0) { + clauses += `${useClause.name} as ${useClause.alias}, `; + } else { + clauses += `${useClause.name}, `; + } + return clauses; + }, ''); + clauses = clauses.slice(0, -2); + + lines.push(`use ${groupName}::{${clauses}};`); + } } - return allImports.sort(); + return lines; +} + +function sortUseClauses(contract: Contract): UseClause[] { + return contract.useClauses.sort((a, b) => { + const aFullPath = `${a.containerPath}::${a.name}`; + const bFullPath = `${b.containerPath}::${b.name}`; + return aFullPath.localeCompare(bFullPath); + }); } function printConstants(contract: Contract): Lines[] { diff --git a/packages/core-cairo/src/set-access-control.ts b/packages/core-cairo/src/set-access-control.ts index 19f3b0031..7bd3c2218 100644 --- a/packages/core-cairo/src/set-access-control.ts +++ b/packages/core-cairo/src/set-access-control.ts @@ -15,7 +15,7 @@ export type Access = typeof accessOptions[number]; case 'ownable': { c.addComponent(components.OwnableComponent, [{ lit: 'owner' }], true); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addConstructorArgument({ name: 'owner', type: 'ContractAddress'}); break; @@ -40,10 +40,10 @@ export type Access = typeof accessOptions[number]; } addSRC5Component(c); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addConstructorArgument({ name: 'default_admin', type: 'ContractAddress'}); - c.addStandaloneImport('openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE'); + c.addUseClause('openzeppelin::access::accesscontrol', 'DEFAULT_ADMIN_ROLE'); c.addConstructorCode('self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin)'); } break; @@ -76,7 +76,7 @@ export function requireAccessControl( const roleId = roleIdPrefix + '_ROLE'; const addedSuper = c.addSuperVariable({ name: roleId, type: 'felt252', value: `selector!("${roleId}")` }) if (roleOwner !== undefined) { - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addConstructorArgument({ name: roleOwner, type: 'ContractAddress'}); if (addedSuper) { c.addConstructorCode(`self.accesscontrol._grant_role(${roleId}, ${roleOwner})`); diff --git a/packages/core-cairo/src/set-royalty-info.ts b/packages/core-cairo/src/set-royalty-info.ts index 4c4b1d210..5464be105 100644 --- a/packages/core-cairo/src/set-royalty-info.ts +++ b/packages/core-cairo/src/set-royalty-info.ts @@ -48,7 +48,7 @@ export function setRoyaltyInfo(c: ContractBuilder, options: RoyaltyInfoOptions, ]; c.addComponent(components.ERC2981Component, initParams, true); - c.addStandaloneImport('starknet::ContractAddress'); + c.addUseClause('starknet', 'ContractAddress'); c.addConstructorArgument({ name: 'default_royalty_receiver', type: 'ContractAddress'}); switch (access) { @@ -69,7 +69,7 @@ export function setRoyaltyInfo(c: ContractBuilder, options: RoyaltyInfoOptions, } if (feeDenominator === DEFAULT_FEE_DENOMINATOR) { - c.addStandaloneImport('openzeppelin::token::common::erc2981::DefaultConfig'); + c.addUseClause('openzeppelin::token::common::erc2981', 'DefaultConfig'); } else { const trait: BaseImplementedTrait = { name: 'ERC2981ImmutableConfig', diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index f765b90ca..992d4b6a0 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -18,8 +18,8 @@ function setUpgradeableBase(c: ContractBuilder, upgradeable: Upgradeable): BaseI c.addComponent(components.UpgradeableComponent, [], false); - c.addStandaloneImport('openzeppelin::upgrades::interface::IUpgradeable'); - c.addStandaloneImport('starknet::ClassHash'); + c.addUseClause('openzeppelin::upgrades::interface', 'IUpgradeable'); + c.addUseClause('starknet', 'ClassHash'); const t: BaseImplementedTrait = { name: 'UpgradeableImpl', @@ -43,7 +43,7 @@ export function setUpgradeable(c: ContractBuilder, upgradeable: Upgradeable, acc export function setUpgradeableGovernor(c: ContractBuilder, upgradeable: Upgradeable): void { const trait = setUpgradeableBase(c, upgradeable); if (trait !== undefined) { - c.addStandaloneImport('openzeppelin::governance::governor::GovernorComponent::InternalExtendedImpl'); + c.addUseClause('openzeppelin::governance::governor::GovernorComponent', 'InternalExtendedImpl'); c.addFunctionCodeBefore(trait, functions.upgrade, 'self.governor.assert_only_governance()'); } } From e522d0b841382ceaa6e8ecb31aac34f3e1aa8d59 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Tue, 10 Dec 2024 14:43:10 +0100 Subject: [PATCH 11/20] feat: split use clauses into multiple lines --- packages/core-cairo/src/print.ts | 38 +++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 8c4297155..3c7a43511 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -8,6 +8,8 @@ import { compatibleContractsSemver } from './utils/version'; const DEFAULT_SECTION = '1. with no section'; const STANDALONE_IMPORTS_GROUP = 'Standalone Imports'; +const MAX_USE_CLAUSE_LINE_LENGTH = 90; +const TAB = "\t"; export function printContract(contract: Contract): string { const contractAttribute = contract.account ? '#[starknet::contract(account)]' : '#[starknet::contract]' @@ -59,7 +61,8 @@ function printUseClauses(contract: Contract): Lines[] { return result; }, {}); - return Object.entries(grouped).flatMap(([groupName, group]) => getLinesFromUseClausesGroup(group, groupName)); + const lines = Object.entries(grouped).flatMap(([groupName, group]) => getLinesFromUseClausesGroup(group, groupName)); + return lines.flatMap(line => splitLongUseClauseLine(line.toString())); } function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lines[] { @@ -100,6 +103,39 @@ function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lin return lines; } +// TODO: remove this when we can use a formatting js library +function splitLongUseClauseLine(line: string): Lines[] { + const lines = []; + + let containsBraces = line.indexOf('{') !== -1; + if (containsBraces && line.length > MAX_USE_CLAUSE_LINE_LENGTH) { + // split at the first brace + lines.push(line.slice(0, line.indexOf('{') + 1)); + lines.push(...splitLongLineInner(line.slice(line.indexOf('{') + 1, -2))); + lines.push("};"); + } else { + lines.push(line); + } + return lines; +} + +function splitLongLineInner(line: string): Lines[] { + const lines = []; + if (line.length > MAX_USE_CLAUSE_LINE_LENGTH) { + const max_accessible_string = line.slice(0, MAX_USE_CLAUSE_LINE_LENGTH); + const lastCommaIndex = max_accessible_string.lastIndexOf(','); + if (lastCommaIndex !== -1) { + lines.push(TAB + max_accessible_string.slice(0, lastCommaIndex + 1)); + lines.push(...splitLongLineInner(line.slice(lastCommaIndex + 2))); + } else { + lines.push(TAB + max_accessible_string); + } + } else { + lines.push(TAB + line); + } + return lines; +} + function sortUseClauses(contract: Contract): UseClause[] { return contract.useClauses.sort((a, b) => { const aFullPath = `${a.containerPath}::${a.name}`; From 3ee82b20441a9fc9e7d34709999740f4d82b3fa6 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Tue, 10 Dec 2024 15:05:56 +0100 Subject: [PATCH 12/20] feat: add uniqueName logic --- packages/core-cairo/src/contract.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index 3a210515b..1c4556dbd 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -149,9 +149,10 @@ export class ContractBuilder implements Contract { // groupable defaults to true const groupable = options?.groupable ?? true; const alias = options?.alias ?? ''; - const present = this.useClausesMap.has(name); + let uniqueName = alias.length > 0 ? alias : name; + const present = this.useClausesMap.has(uniqueName); if (!present) { - this.useClausesMap.set(name, { containerPath, name, groupable, alias }); + this.useClausesMap.set(uniqueName, { containerPath, name, groupable, alias }); } } From 632529bde77176aa58c5079b13e38bb50e62a4af Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 12:10:01 +0100 Subject: [PATCH 13/20] feat: use const --- packages/core-cairo/src/contract.ts | 4 ++-- packages/core-cairo/src/governor.ts | 2 +- packages/core-cairo/src/print.ts | 28 ++++++++++++++-------------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index 1c4556dbd..b7f77d6a6 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -149,7 +149,7 @@ export class ContractBuilder implements Contract { // groupable defaults to true const groupable = options?.groupable ?? true; const alias = options?.alias ?? ''; - let uniqueName = alias.length > 0 ? alias : name; + const uniqueName = alias.length > 0 ? alias : name; const present = this.useClausesMap.has(uniqueName); if (!present) { this.useClausesMap.set(uniqueName, { containerPath, name, groupable, alias }); @@ -170,7 +170,7 @@ export class ContractBuilder implements Contract { addImplToComponent(component: Component, impl: Impl): void { this.addComponent(component); - let c = this.componentsMap.get(component.name); + const c = this.componentsMap.get(component.name); if (c == undefined) { throw new Error(`Component ${component.name} has not been added yet`); } diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index d56e1162c..ad16ae3c1 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -403,7 +403,7 @@ function addQuorumAndVotes(c: ContractBuilder, allOpts: Required 0) { lines.push(`use ${useClause.containerPath}::${useClause.name} as ${alias};`); } else { @@ -78,7 +78,7 @@ function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lin } } else { if (group.length == 1) { - let alias = group[0]!.alias ?? ''; + const alias = group[0]!.alias ?? ''; if (alias.length > 0) { lines.push(`use ${groupName}::${group[0]!.name} as ${alias};`); } else { @@ -87,7 +87,7 @@ function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lin } else if (group.length > 1) { let clauses = group.reduce((clauses, useClause) => { - let alias = useClause.alias ?? ''; + const alias = useClause.alias ?? ''; if (alias.length > 0) { clauses += `${useClause.name} as ${useClause.alias}, `; } else { @@ -107,7 +107,7 @@ function getLinesFromUseClausesGroup(group: UseClause[], groupName: string): Lin function splitLongUseClauseLine(line: string): Lines[] { const lines = []; - let containsBraces = line.indexOf('{') !== -1; + const containsBraces = line.indexOf('{') !== -1; if (containsBraces && line.length > MAX_USE_CLAUSE_LINE_LENGTH) { // split at the first brace lines.push(line.slice(0, line.indexOf('{') + 1)); @@ -148,8 +148,8 @@ function printConstants(contract: Contract): Lines[] { const lines = []; for (const constant of contract.constants) { // inlineComment is optional, default to false - let inlineComment = constant.inlineComment ?? false; - let commented = !!constant.comment; + const inlineComment = constant.inlineComment ?? false; + const commented = !!constant.comment; if (commented && !inlineComment) { lines.push(`// ${constant.comment}`); @@ -175,17 +175,17 @@ function printImpls(contract: Contract): Lines[] { const impls = contract.components.flatMap(c => c.impls); // group by section - let grouped = impls.reduce( + const grouped = impls.reduce( (result: { [section: string]: Impl[] }, current:Impl) => { // default section depends on embed // embed defaults to true - let embed = current.embed ?? true; - let section = current.section ?? (embed ? 'External' : 'Internal'); + const embed = current.embed ?? true; + const section = current.section ?? (embed ? 'External' : 'Internal'); (result[section] = result[section] || []).push(current); return result; }, {}); - let sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( + const sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( ([section, impls]) => printSection(section, impls as Impl[]), ); return spaceBetween(...sections); @@ -253,15 +253,15 @@ function printImplementedTraits(contract: Contract): Lines[] { }); // group by section - let grouped = sortedTraits.reduce( + const grouped = sortedTraits.reduce( (result: { [section: string]: ImplementedTrait[] }, current:ImplementedTrait) => { // default to no section - let section = current.section ?? DEFAULT_SECTION; + const section = current.section ?? DEFAULT_SECTION; (result[section] = result[section] || []).push(current); return result; }, {}); - let sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( + const sections = Object.entries(grouped).sort((a, b) => a[0].localeCompare(b[0])).map( ([section, impls]) => printImplementedTraitsSection(section, impls as ImplementedTrait[]), ); @@ -406,7 +406,7 @@ function printFunction2( let accum = `${kindedName}(`; if (args.length > 0) { - let formattedArgs = args.join(', '); + const formattedArgs = args.join(', '); if (formattedArgs.length > 80) { fn.push(accum); accum = ''; From 567551724e0535db4111cda8a5b96bc5162bd309 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 12:32:05 +0100 Subject: [PATCH 14/20] feat: add generate script --- packages/core-cairo/src/account.test.ts.md | 84 ++++- packages/core-cairo/src/account.test.ts.snap | Bin 1732 -> 1774 bytes packages/core-cairo/src/contract.test.ts.md | 9 + packages/core-cairo/src/contract.test.ts.snap | Bin 715 -> 720 bytes packages/core-cairo/src/custom.test.ts.md | 42 ++- packages/core-cairo/src/custom.test.ts.snap | Bin 1320 -> 1339 bytes packages/core-cairo/src/erc1155.test.ts.md | 212 ++++++------ packages/core-cairo/src/erc1155.test.ts.snap | Bin 3353 -> 3389 bytes packages/core-cairo/src/erc20.test.ts.md | 312 ++++++++++-------- packages/core-cairo/src/erc20.test.ts.snap | Bin 2731 -> 2752 bytes packages/core-cairo/src/erc721.test.ts.md | 295 +++++++++-------- packages/core-cairo/src/erc721.test.ts.snap | Bin 3491 -> 3515 bytes packages/core-cairo/src/generate/governor.ts | 30 ++ packages/core-cairo/src/generate/sources.ts | 7 + packages/core-cairo/src/governor.ts | 14 +- 15 files changed, 574 insertions(+), 431 deletions(-) create mode 100644 packages/core-cairo/src/generate/governor.ts diff --git a/packages/core-cairo/src/account.test.ts.md b/packages/core-cairo/src/account.test.ts.md index 291f802a3..a9682bd8b 100644 --- a/packages/core-cairo/src/account.test.ts.md +++ b/packages/core-cairo/src/account.test.ts.md @@ -15,17 +15,19 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -80,9 +82,11 @@ Generated by [AVA](https://avajs.dev). component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -120,17 +124,19 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -185,9 +191,11 @@ Generated by [AVA](https://avajs.dev). component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -225,14 +233,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -240,6 +249,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -294,6 +304,7 @@ Generated by [AVA](https://avajs.dev). component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -301,6 +312,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -338,14 +350,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -355,6 +368,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -405,14 +419,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -422,6 +437,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -472,14 +488,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -491,6 +508,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -541,14 +559,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -560,6 +579,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -610,14 +630,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -631,6 +652,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -681,14 +703,15 @@ Generated by [AVA](https://avajs.dev). mod MyAccount {␊ use openzeppelin::account::AccountComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = AccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -702,6 +725,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl AccountInternalImpl = AccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -753,17 +777,19 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -819,9 +845,11 @@ Generated by [AVA](https://avajs.dev). component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -860,17 +888,19 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -926,9 +956,11 @@ Generated by [AVA](https://avajs.dev). component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -967,14 +999,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -982,6 +1015,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1037,6 +1071,7 @@ Generated by [AVA](https://avajs.dev). component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1044,6 +1079,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -1082,14 +1118,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1099,6 +1136,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1150,14 +1188,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1167,6 +1206,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1218,14 +1258,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1237,6 +1278,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1288,14 +1330,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1307,6 +1350,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1358,14 +1402,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1379,6 +1424,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -1430,14 +1476,15 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::account::eth_account::EthAccountComponent;␊ use openzeppelin::account::interface::EthPublicKey;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ #[abi(embed_v0)]␊ @@ -1451,6 +1498,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl SRC5Impl = SRC5Component::SRC5Impl;␊ ␊ + // Internal␊ impl EthAccountInternalImpl = EthAccountComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ diff --git a/packages/core-cairo/src/account.test.ts.snap b/packages/core-cairo/src/account.test.ts.snap index 6f8ed6ad588c6bc82e73b150b732cd14e85ac76d..276a6b33b2db0a019466184f1f7a943bdb8c1c70 100644 GIT binary patch literal 1774 zcmVO z%riSrW}fHwU$39scRHSL??v}sdBB7#Jhs2uWey#9f;a=uBhI3u8IRc7 zPM2}vIxY(>a&hO2TC+)7em|hX?RbpbaYc_@3K;*21p)J1PFg+}A+<$B96uy2>V`hK zxv_rc-19juq-=nSdVXb^+v7lcge+r3*%$*b&U{01`#8E!1&#G0LzNo zTUOj~cso94T%4cM!Q~?Kqk!4M^|@t5p}lEYyH{G9r9ETUMI#$5bg0cNYv*d_(DIH_ zW6f}xJ6ax%qK|3RJ6{`JwUfpt>j4!#i{xk9Ad&DxdW%`vpPb!hT%=96hexaD_2!iM zOSXpINevAf6$Kz6S--=&?b{oxH%2Gj ze&8k3yEt6mJHr$2O*kiA9BHF>lZCk}s9^7BgYIx?P}zQRVd@Zag9-DgHEF&%i#q3( zSdBdsJ9zAqNQ47hklpdQc-zG72A#NRJ$2#mC)q-pNyTOw4`F4rk<^9sNd2YNp4o3 z9x3UV-w)GVA(=@XVf%di*Z0G*L5CCRTs>qCiJ0eDL|I4;5)3+?Yq$5e-{WZmViaH;3sWnn$*7e|EjR;F!MdHD~IeTT>aG`GT~dvJKNK&DTFvpa2j z7&zNK8ucua22pu36BD9Q#6r>bxp&YWUZ}@&Q5s8&Gx@!)4kz_GjD2xfOLFpBaZctw zUn|VZ#{wlU(_;&om#diz=P_X!mRihD29=89S>!s+_5;tgUC0T@3CM}6L}x8eK~6wU zKu#=zoLDbO%Fq+g6BWx?hUFIXvq7c8cow=|?a;`zvwc*oAO2Iq)IZP<&<|DD54%@d z?@SGm$we*D7u#&nKJzYd@1W4Q((2Ji*^G_nLt}geG6yo}nI|?~N64IclsRwaSfNzb zEWfPq!pic3@Vx=`!1+Aqyu%=*s6x2>oznK|`p% zCnOgn*HLDQt#}_!9YAhid=}F3EaV*I9OT>r$hk0skHGT}^a^g}s)8RM0Y88rz>nGC zN3s(O07PyA1Ob8oL4Y8pBgoicWRD$a5ad?{L4E>)06~BtvqF%|qn-E(n?8cl;&H8y zZn1obv>8ALpaakW=okt*`>*Fe>1h-{cKKOho(EtaFb|l=#7}+jNC%_?(gEo#GU*gO z-8qqaMeqbj2c!eiF_3id*K|sV>NSO^UIbBrs6bSvzOnt~qin1Q_N^RK;lsAJC?b5U*4Mfxh-t^&+Vou z?wMN%kOS=m2}sLkerQ0R)YBk>jZz{guj2QwLIr=DRK>4~R8aLyya4Ia%)~Y?si>Mc zMEW-hYTZ-FD99+tsD;Q2T4IEZf{cQUT5K70rW^^NqoAXpqfE$b^OB3InMAUn`Np`g zsvIl}1LR6y36M8U`g&Lu1EjtubW^o;ll0P%J`^6^dqY$0SEej2v>mh^v>mkFEVbRq zNlYm(0sp;%D&Lq?0=|l3`_^61Ji-&@`(1-zip&_RjY*RepIOL2T&cT4pe6z)y@0~7sw7|2eQ+%703=` QHxsh^A0FZ#m>j(T08eC8ga7~l literal 1732 zcmV;#20QsdRzVf!n=f{9bvqvJ>LhiKUXYNn(+ zpstMwq#uh200000000B+oKJ7#L>R^kY}Gaw#0?Ozv#f+tNdK)=BwSdjN-I%8wbd3R zVChB^XS^BJ8C&+G+b;9~XD-|jh(oy{ap1@&fKR}8;J}>&7v#jTXB@|FX|uJHC#NQv zc_;IB=6!yTo%%|L(<~nB>xC$BQjy(XK6t)wOLxP1ETLStA{O%msOiblpcD zZ86%k8TSQs{k9|hug+R6D(R<8UW@lb__U7Em3fbS=`ef-tZZhGsrJWWN zl3Sd42HD;DsIsy`>Q2X{k~eKe9&_0y_gp4EW3J0=E=b)G(xayIiRE~tPPylhhpWqL z?<}uYDz_i_l6r@NNy9M1hSl%`FCJ7nPK)fGZ1$g%FDir(()Af}Tqd4`0~kiw-Y~+3 z!N+j~6LMoj2QH-N_%1UgcZ6a1p1E!q`}gbXxjnR<&Wj=|BY01fn8fGF)U_S@G^tz@b z`~BC#Z4tKXHp8aXC}qK8uticP6^5yuBT8?h=nLgS{gwZI`btSeI~`2Fw^9zmCoSgj zBUat=9Ji+Im;T!6H)5jOA-xy0>{vFH@uyKYMOtEdZ`4M1kG8^4MshkP*ZZhcC}E;R zn2zZG_Z_bv&=N#>t?Dt0_{_EpqAjEval1{Mn~g(uVi1ej^3M95MI|>upXG3oEOWsn zr#64WylUJp-0`P*n^Rr>!E?tVYN<=CaOE>tVz59)PeZWB4KpZ=jW+e$28oKKI+>vf zQQv2tY&gO`X#{Un!?|dUmBl&uyQ&YT^g0c5aatK@?ozhq3P&tu>h6s_O?NkMOsVb` zQ|rnoNF|ew@)!F;Rq41gy~&PUo0}YV0CoU&0CoU&;Mx=-tt0HfB-(-H9MOdzfFFP# zfFHO9Kk#ys`rM57NjCrgsgZOS|ZbX!ZN`!T}BDE!hJV#0JTBsR3?>2VaH&{V8^Dwj(IU$ zxVCeW?!e~PHN1EOcmccsUR)hs40c`yV5m)i7(fgl1`wlch|y0NIb1gjUGX3@qeTDK4Sh5Q8R!HKn5TKkSPhs9KVwMCZ?8s+2mV|X}$*2 zfN8)qW%yPGmt;UPAQ_O%G?7f^)tSUCcpw>&3`nL7B!eqI;3e=9cnQ38xgRYI-zJko zO#f=c^f!nJ!~|k0%PljYCQuWo3Dg8?x)e3lv;!)cY;O((^?V1x{j4$6_hmW=g2{Fx zda@nOJeP5zJ__P&%XXv%lg(l&iBhOX$!SDAagRx%vUo=7Sw1P5QP+al zmH9`QM3_XF#G(sO;uo)}V_esv>hPfOpzxsZpkwr)T@7tA4iNiQgPSwJ4d4cFQ+&8d z{5W+4-dxxDVE`Ne4gd#$^OOK5>y(Uzmo&hsEC6r-H~^f215WaEjMPD{{D6$?QLg2T z43HE^3M2)R8t3f_H&ea_%RY8~;du?JW&l-yDnM1yp=!)uiQ%FYPzopolmbd6Q7ZHL z)Uk$A94G~p0!mFeO5ySsm<`OkJ`R(xt3`xPpX a8^{gh)_;K9KyG6pxBmbwHiTasx&Q#Bu14no diff --git a/packages/core-cairo/src/contract.test.ts.md b/packages/core-cairo/src/contract.test.ts.md index 209c617e8..7f5763816 100644 --- a/packages/core-cairo/src/contract.test.ts.md +++ b/packages/core-cairo/src/contract.test.ts.md @@ -122,9 +122,11 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: FooComponent, storage: foo, event: FooEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl FooImpl = FooComponent::FooImpl;␊ ␊ + // Internal␊ impl FooInternalImpl = FooComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -161,9 +163,11 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: FooComponent, storage: foo, event: FooEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl FooImpl = FooComponent::FooImpl;␊ ␊ + // Internal␊ impl FooInternalImpl = FooComponent::InternalImpl;␊ ␊ #[storage]␊ @@ -178,5 +182,10 @@ Generated by [AVA](https://avajs.dev). #[flat]␊ FooEvent: FooComponent::Event,␊ }␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.foo.initializer();␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/contract.test.ts.snap b/packages/core-cairo/src/contract.test.ts.snap index 6614142a2f7ea324edcc2df971edcaeb4f0400bc..4be8de0cd657ecb7149098d6c7711c3b608ed532 100644 GIT binary patch literal 720 zcmV;>0x$hRRzVZ6M*hG+%3!X)?hqmjxO` zrtL%wKOc(-00000000B+RnJeszbag~6-M-IZ;XpmDg;PtmZF z3T*^0`a40l3mcT>f>o>$-YGtUmpPg@nCGaKfel~Kfg}qXLRo^htDUtcoz);%+H)-I zu|bZaQD^%>Mk(}&;9~#)P+-W4L){F? zw2C^+R6?4}jNw0Lc(KW_^w5gl7$w#0+a1eSQyjAx(}S^SrQ$uJesO=+C{s38 z#Gf`kozE}Q_f0MRIFk=f%~*dqJ?-xtY>ykp9y)ObiK2ZH>7CQ35J`N z@`B%yh83d~2+c5qGSKKlYQY!PM=DIVPzEO&_!~bj)UqRqIyEbVi=`LV7N`8o9ySf+ zSeR63GFa$GmZ$g!8va?BzefJiDz?JDkD>u(xLqyQXC9k*?B9E==B=MzME1D=Sf!p}Mn1%<8BEmanhejhSO9XLT zV~#<<2p@|G00000000B+Rn2bGKoCxg5W+WZoM31#j?^YCHyq%SHd3V`kkUh;D%IK^ zx2vvqtldc|pbBw9yaCs8;|+Kb-hc-|_HKfmMg=4!T2Wu@9e?xpeKYoH7Ar~)?T63E zk`+=ynvF;pVqs-srPZRa2gLUMX_^Wa+h4D>ZnVm4?t1Ii{Fhd@3&Uq?+sm6WL2Yq) zBSpmu5?x(bXJ03 zamTVShZ;GG#+B^`Ii)Zlg0}$xK#3tE_Hnm5S~jDEVd!iga}t~czQf}?lNPID64K6v z3?!7|nU0^&-EOpebMBI~?4h*=9X!+ZrbB}nSX5awscXoBvF+nj2`I4)LAX&G9g9!is3(Jc%jK~=An+>7&9`n2KQZq*5Z=Ux{n%-VBBLPB=35wh-Fxy z*^`WU+ZknEC|EycG+HR2Z1TKSI@VZT+(G{)JX-P2UazJAHJ|cw1dnw&PczrRw0ie{ zt=`m*oc-`#sd-V?%Vu7*KTC7YB`Du!3R+^ASx4* zM$J8^Su#G~3o8uNF-zdJk02vj0z5*^6=c19YWISg!kEXH?oC9h6dn+5l=nxCuvHcxos7%n0?Dv%~z(;CkFB_Ry&rBZ{WddiSN~*jK!ar#(d@k1$*_RFwRU zHFAtO5b9A5m7!5brUd`YK4y8kgvvNoz~A^ep~^ZLQKvTQ;X*a*s|z!JR(G2VVp-@^ xDAHK!M}}wY$EU`Ae7s2ep=4}?c^ySV%5l>jdRII2U+mCH@B>7pV@n|o002((R4o7i diff --git a/packages/core-cairo/src/custom.test.ts.md b/packages/core-cairo/src/custom.test.ts.md index ef3f7ffbb..a31e5cb46 100644 --- a/packages/core-cairo/src/custom.test.ts.md +++ b/packages/core-cairo/src/custom.test.ts.md @@ -29,17 +29,18 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyContract {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ ␊ @@ -86,20 +87,21 @@ Generated by [AVA](https://avajs.dev). mod MyContract {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -137,7 +139,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -166,17 +168,18 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyContract {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ ␊ @@ -237,17 +240,18 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyContract {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -294,22 +298,22 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ + // Internal␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ ␊ @@ -372,11 +376,13 @@ Generated by [AVA](https://avajs.dev). component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ ␊ diff --git a/packages/core-cairo/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index 08994387bb602233ccfe7605e3d8daec92b51c58..80e058dc9b76f7f2bbae8188974dda3c64baf930 100644 GIT binary patch literal 1339 zcmV-B1;qM6RzVY00000000B+TFY+ZHWW=;G;O@=A8@89-~djX4vvElCrh6#MgKnf zbm@za|6FRf(b2*7>Dn%}feBdaIlv@!DR7MTddH1+8+H9*KqT#ZfUc<=p#1>Y&kzLQ zQHHuclbqO6AlK)pODOlzuN&)Mf3v>PXngsLkc3|{kQm#_@Vqhf9kh3wI-G%wo+^TR?D=jdlOaga_4H)-M#_RvEqh?$(+!)kd*CRswNW`F( zG0|}x4nmB!8nJ_&`oC%hL=G@2i`_zMoiWn#w1wabm^55=qC2Zw<)QNoX<-$MSx9A? zhKu91+i2%T0%yci*+=@c3Bx`(*44&pl7n;@c&Yauy`iiZ-FRCVJ6o^J=-ZT`BS|ED zHy*Udv_a$e8sPLxHB1?M80$ubVe+%iMJ!JI-e`}mOJx`Km1#4hFwUbfj`EbiScPjn zB3fD_C18vwqjdUl7M!aK2ROZg<~H|(mX_Q}ZX`y)!Xb)p80cJ&$nh-lX<7v={<2jW zMo-N$M4Ees$M#vW2tH2&xeRIdnjBmtz;iJ&*0U8c7j1R9;$78HMsDkh;C0HVq{O4| zfHz}TRf^d}swzg$=;+#ak-jD6(o7rPWofQdgJ5uN+0jm94TuEKLQ*u+|ba{oFLi)4WD`MH&Po6s4Mbw(^%DMITlcP>KZDA*b>dI)NncSqtQF$Jo`r9jen{VTQV7qVxYVLH@(9pB}B2QBsa z!^`(=_4z}6{!pJk)aMV2+%IHmbe-(tDBk^j4>>eeGG}2Q0bJz(E3#`PoU_+ENubQt7o7d4kIT1-q{#Tq}eAkJuyUDe-i*N6I-#OVmwmRE;y`SPa zjHgofqsWvO%hJIWtgiW?94;QdVd-TKV-W_9KZ&p(`;m(CAIl-J-(Oy5NLKD^lZT zQDj=?gf)GCAe6CXw=y_$*dv)3^-ie>bn;!(%~$E+d(zrG_Bi8g`Cp@t`g;+7-aql} xit!Y4H8l@!I6P7D>(>xw^xXZqUl>@NNBpz*3%`C8J)@7J{{xzh?_UTo006AxiLC$t literal 1320 zcmV+@1=spPRzV$1$@$RCRc00000000B+TFq|bHV{r*G(~)CpMcq-fCD%`T_A@t-2#S_b`2y=kRNo@ zA{A(96cdq2fu!=YMGn37HMZAYdhVq!&^PGI6p|>J)K8ogcGfnWOH65I$Zt5qZ#2?7 zzZY=#O8)jcD5?Uub|b0y05Q(iqwrD?4@fTnDj5l7pDX$6JI^DEy!rd1rB9aPzYjiM z`t-v;mo_)i$hRp=zWre*FM_YIAgYrG!#Bnp%)0X<*-!9x0ad0LQ05)co8z14;>Caw!o zV$5$?ylEI8ra$84a0X26)F|qmmKdK6_xuT3lqnECaRKA5VPU8^1l0+Ml&^{GSKibJ z+ny&t%AH0c<7Nw4ZH7ekF{)Z*3+a8w$cWn(f@@&PQrU~ItnE~rE_%!`tG$|=)S{U= z9et!nn=t5s=Ui{Cr7=hcVUS55&|Av7@r75Vx$^zWg}%-la-xWWZ}cRIJp)iT_C6zl zHe2N#j7_1E+2Se-7Rw8L(AuN(P|HOLn7CJv5YPgDG7}fzxZnkR8n4wpN$WYJmxSXY% zz(s1vXUMqL6yPHXfsc{3pRL$)@zGYu%{2pMthS*Yyg?aNlmzrGh-RXyQ|*3KhL{l@ zkGYS`!=w;q#`HeRVx=AggB!<WAs9AG9+rfq@_j93=?N<280s2*RNX2BwSlZjD2N`}z1ZR<`06 z^c_2!e3qnlt)Ir=jO_T>NGGz8KW2Rqd$tv3Q$1AOT|Lx9S@agBuSQ$+78bpQMQ>rz zTQC@9=4ykSeQwfI8zrYb50FO_=JMvYoqt^btew4J-Wg!tS?pzun|bHIJur`t^^2$S z1@jh&NEL`k@Bk`aF0ZUwH1yeIJN!vtptGazj@!F?$IkKL{vJj?1nTAXOY|y+4RO${ zHeXmWFXD4>EEJah*FM3xoeVqaa3nF+7}?$XwtcpL>a=$cy5A@3tusJl4H<%~D39Mf z2zMLfljF|z>@sOC5``czwzjQ~XREz#P^0DGoE$B+2btG$sbM#Ecy2BhdjI@wfihXV z+DV0weGH>p3I!Ifn`Cy`-OkNgfKOohBunj(n&C>JoJ93b8c{Xm2~_gVdn`BdN$My& z7tkMEIm8=KR;oi<#r-RnDyc}RV6h_5DqFJCphncW6oe@!ChBIHQ(E?d4eB3Z$~ux; zIh+|RpKOd~5mg2{{(|cEi>&XSRy~jHY@9FuYn534%;S^(6F;Ju=?@o1B+TOLf+=aS eKlgV4^Yi9@`X25VZ<(j`E%SfCKKdEIF8}~QM}XD< diff --git a/packages/core-cairo/src/erc1155.test.ts.md b/packages/core-cairo/src/erc1155.test.ts.md index 1d01fbe55..2f45791af 100644 --- a/packages/core-cairo/src/erc1155.test.ts.md +++ b/packages/core-cairo/src/erc1155.test.ts.md @@ -15,19 +15,20 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use starknet::ContractAddress;␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ ␊ @@ -86,23 +87,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -145,7 +146,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -175,22 +176,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use super::{URI_SETTER_ROLE, UPGRADER_ROLE};␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -198,6 +197,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -249,7 +249,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -278,23 +278,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -351,24 +351,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -411,7 +410,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -475,10 +474,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -486,6 +484,7 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -493,6 +492,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -545,7 +545,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -553,7 +553,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -594,23 +594,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -653,7 +653,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -719,22 +719,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use super::{MINTER_ROLE, URI_SETTER_ROLE, UPGRADER_ROLE};␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -742,6 +740,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -795,7 +794,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -859,23 +858,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -918,7 +917,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -947,14 +946,11 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -962,6 +958,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -973,6 +970,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1025,7 +1023,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1055,18 +1053,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use super::{URI_SETTER_ROLE, UPGRADER_ROLE};␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1074,6 +1068,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1087,6 +1082,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1147,7 +1143,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1177,12 +1173,10 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1190,6 +1184,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1201,6 +1196,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1249,7 +1245,7 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1257,7 +1253,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1287,17 +1283,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::token::erc1155::ERC1155HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use super::{URI_SETTER_ROLE, UPGRADER_ROLE};␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1305,6 +1298,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1318,6 +1312,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1374,7 +1369,7 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1382,7 +1377,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1413,16 +1408,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::ERC1155Component;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ - use super::{PAUSER_ROLE, MINTER_ROLE, URI_SETTER_ROLE};␊ + use starknet::{ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1430,6 +1422,7 @@ Generated by [AVA](https://avajs.dev). component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1445,6 +1438,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ @@ -1512,7 +1506,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1624,19 +1618,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ - use super::{PAUSER_ROLE, MINTER_ROLE, URI_SETTER_ROLE, UPGRADER_ROLE};␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1645,6 +1635,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1660,6 +1651,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ @@ -1734,7 +1726,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1742,7 +1734,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ diff --git a/packages/core-cairo/src/erc1155.test.ts.snap b/packages/core-cairo/src/erc1155.test.ts.snap index 7b320e027bac40f047d7e999fdf1f950b740a344..aaa852fc1441556bc6f0767cdb058bd1d3650fd6 100644 GIT binary patch literal 3389 zcmV-D4Z`w4RzV+e4#_K2mMbR}2>r#mV zVh7G*w49YTUe0c3XJs>j9@0P1_PsCZYkx@pLErih^3>P96tg$Z?1d}R6v-tIA8b-P zb7tl{v$N-X=j_an=Be!%uf4zggK&%6#6QKJWgzO%N4|T;aF^gyn^+#ju6OQm?}s0| zUCi-|_y6|uTfe*|KJWeF*2h2l^ZRRS==gB=>qpNmgHVq=YIh0cmT3{Dp}lrzWo->L zot}%ib!rpz#^UGbz$Nr0ab03t6g3^n88*0wOoyQ+wwQyyU0>aJyt=-!^57efWA>U7 zu4zV8@YPDs>7u=U$9YXCx?DjBA>Sj&aS8oClB#LgFo@@An)8N=foR%6_(k-^p@i}$ z1r;sInd7;{;Fd!*&11%vrX3$Ow@Pbr(IHJE%-Go2+S0Vk)=^V@ODfh;^p|Ij^V)0m zT;6Z@T>EMua4^~!mPWVBi03_73Cb9;sCzXR^K%VloA9{9@EOri)Q>tM7liVpXiNNh z_#|JPGEPaBKp_z%3JsN#hFTI7sUwjU6^+FO^48W+>n$gYVmtW#;2V5u)kyD@boGn% zhp&P^T0Pf}hqPzCwWvT6ZD#<{v~-~_V`z^#=H#mQ)yuG z7~%_s!;lN)4ngj1N?NwVL#0KCL`n;>@Hq1gj*i2>MYmm4&OeQc))MH%C%zGK1`~;? zUqec81F92qr26p!kOP7u#6%vkO${j%r!Jrt ztA1+fdMLpns;x%zV%4G+x3Fz}Pgw2#Ip?mYt*xD5PTt`Ds%ufq@v31ves|4sO>gaw zJ>&54`CCSt8=b92=dkyuO%FdMjlGS&`}FI_JG9}wX?CCOJpM!TyXTFy`_bx@G#gC> zrP-jzQNd*VXM_@lIng=8Rx%UB`rs0#Tb%TiHR!E$t2t)!yCW(qGlE1{)cI*r{P$`lvS3JH!DKC#54(!Ra`GWqEEBX?RDqG{=mni3%)|!KwD!rs zpe(N_70&7Z0Nl%_jXm!f_Rj0+73XS6tfgFWdH6{pCF4F3D^&qQY@Q6UM4F_bl*BxB zgLyZq6zQ(Wzk|S7EU%tkMv9OGn=@;37A<=6jUO49^5ZmhZ%d;#X*{Wmv7_XTZiuI- zevZ9!4JA+13D}j=9Tk7CsqN+1a^hbw!mDhA_d*)+GsGO5cv)lo_EW_e|K05yHO7M# z1f3kU_2X8j(>l_R4xYC(WD=WiZf&A%F-9WRmwUDQsZ!!rj;bI2{;08AQduq|s!qTU z2>%c2I<}@=HiF;H@V8{z?Y5paPM&x4#_nEwKj=WAc@CaJ)>BBz`z~RccB!bco}N6_ zaxIFcOd?L1V~Jd)+HyJ@3ItIj`DkidrtG`4)xMKgZVpq$SvVSVx(XR4l_BSl5# z#p_aT4yEz8u_`L)NUCF$J*4bF z!L=M2K6SD!w!7(42l=k>EQNRIGb`(He(+Dl;Ui+GJd)T+xt+Gc%uP zqMl0{1IX?f+iMvvZMk!W#&B5j#6Zdsg7D8+HhN;#ouB%Q=I0;Z`JZCW{d5P+xdk`p z>gbGc-N3d@n2xJx;z5SbBAR%R;R6{yRWtD*!v{>frOogWMrAQn*f1PlOzDjI5!h9_ z)zy%{x%GJ+U0~ZM;g2+oHsL6=RM2*g*^!k+(l1A$1bK{3Z;Fe776-ZaDD0YJJ3i*%U+~rZ#+Hk+_;+C zlhSekNg)*NcR&J?3?~uwId`$|<J zrz&7wX2QBCYjmz+fVP=W+D2YjgP=)5KNLNBf>Hq~F_gJEC8ooO9^@{OBDW~pNb)t1 znQB3GcueN>O1-8Tc+XLLx+nS^zC~lM2Cj5;CGEVZHCE#VF7|q;!*%gD(ya~Wn}C3u zH31i>sR*kH0Fq3Nu%VG%TAxm>hjCNDAk2nA=vkB(BpCD+2H`tMFj({igKDt@;L9(f zyAAF!BokE4tp%?Xk_nd9mk|c!jYqAcjDxJhop(W4uaO@f?NLz{;vCQV7bDk&nX3yE z)a95OL^sZf@wzZGpdNH?%>001HbS4?Rh;zOpH5*Lp}qEg$reIV32FNv*nJ3yhimUXBu$|@f~|;P zDwY-;*t!X_`UFMMCmvL z3WFgi@C8GNua7C2nogk-e)kVi4Ae6h?XOE*+JY?ZkAG4e+W&kEhrw1U9UHuDI9;{^DcwbYE{?;#2pQs~C@utDkf*8P zq(Qm9rbQi8B)2}RS)dW3&+IexOHo>4N@2G7{slj`;E@Qk%s(@%`eb4 z+E^E#xNQU{0EC~#bE}s&-{Qe=7rG$b;*(d31HJzVq+3)v-2%LO1lbjkT>;q@kX-@U z6+m0enzn%Kig~6mAiDyxD=L^>5%Va+T7&$GVfht6J3)R2%}6)QV-`ymCjF@7-N=X1SC95ktG|H3fPySq}3@g9Y%ED?P5-fjz`Egl6(zhrdm)B zHZYmfD?L5oW>33FlPEUfD0bp?PxLt?0L<0Ehm5YIGnUjEtMM~8=9Z|#^=2-&>i%#Mh^9-IqX2GgfV5y*Kox!to`W(GEJ`nM8r{TG6OE4*v4FtOTs zd_m#eqr?mJIzt76#_)m!#G@e|4e{u?ibuoS9LpZ%hPOf%GiJV2ua!(G^bRkkKy-e- zqVx0fLJWlWs~_HnSBvKF)gs7%fDDK#M93inVzKoL84!>G0T~eEA`cl5*VPAPKwKX% T$bgu52E_jXNXr=0$@~BS=;nae literal 3353 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 jseq7*Ns)(;imU1aLMpBf7=%;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ ␊ #[storage]␊ @@ -53,22 +54,22 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -120,23 +121,22 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -175,7 +175,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -199,16 +199,16 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -216,6 +216,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -263,7 +264,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -271,7 +272,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -302,15 +303,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -319,6 +318,7 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -326,6 +326,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ @@ -386,7 +387,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -394,7 +395,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -425,17 +426,16 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -443,6 +443,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -490,7 +491,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -498,7 +499,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -532,22 +533,22 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -601,22 +602,22 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -668,22 +669,22 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -722,7 +723,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -747,15 +748,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::token::erc20::ERC20HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -763,11 +761,13 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -819,7 +819,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -844,12 +844,11 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ @@ -857,6 +856,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -866,6 +866,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl VotesInternalImpl = VotesComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -905,16 +906,6 @@ Generated by [AVA](https://avajs.dev). self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'v1'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn after_update(␊ @@ -927,7 +918,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -935,6 +926,20 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ }␊ ` @@ -950,12 +955,11 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ @@ -963,6 +967,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -972,6 +977,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl VotesInternalImpl = VotesComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1011,16 +1017,6 @@ Generated by [AVA](https://avajs.dev). self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn after_update(␊ @@ -1033,7 +1029,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1041,6 +1037,20 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` @@ -1062,6 +1072,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1069,6 +1080,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl VotesInternalImpl = VotesComponent::InternalImpl;␊ ␊ @@ -1097,16 +1109,6 @@ Generated by [AVA](https://avajs.dev). fn constructor(ref self: ContractState) {␊ self.erc20.initializer("MyToken", "MTK");␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'v1'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn after_update(␊ @@ -1119,6 +1121,20 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ }␊ ` @@ -1137,8 +1153,7 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::token::erc20::ERC20Component;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use starknet::{ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ @@ -1146,6 +1161,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1157,6 +1173,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1198,16 +1215,6 @@ Generated by [AVA](https://avajs.dev). ␊ self.erc20.mint(recipient, 2000000000000000000000);␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn before_update(␊ @@ -1230,7 +1237,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1257,6 +1264,20 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` @@ -1273,13 +1294,11 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ @@ -1288,6 +1307,7 @@ Generated by [AVA](https://avajs.dev). component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1299,6 +1319,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1345,16 +1366,6 @@ Generated by [AVA](https://avajs.dev). ␊ self.erc20.mint(recipient, 2000000000000000000000);␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn before_update(␊ @@ -1377,7 +1388,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1385,7 +1396,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1412,6 +1423,20 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` @@ -1428,20 +1453,17 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc20::ERC20Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ - use super::{PAUSER_ROLE, MINTER_ROLE, UPGRADER_ROLE};␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ @@ -1451,6 +1473,7 @@ Generated by [AVA](https://avajs.dev). component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1462,6 +1485,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ @@ -1523,16 +1547,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ fn before_update(␊ @@ -1555,7 +1569,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1563,7 +1577,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1590,5 +1604,19 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index 0dcc8297fe89432385e4a3e9e9c2909a61707025..5724c4fc910a00745d45af65136617d72088c8fa 100644 GIT binary patch literal 2752 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␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ ␊ #[storage]␊ @@ -60,23 +61,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -133,23 +134,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -207,24 +208,23 @@ Generated by [AVA](https://avajs.dev). use core::num::traits::Zero;␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -267,7 +267,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -292,10 +292,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -303,6 +302,7 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -310,6 +310,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -361,7 +362,7 @@ Generated by [AVA](https://avajs.dev). contract_state.pausable.assert_not_paused();␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -369,7 +370,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -399,23 +400,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -458,7 +459,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -499,10 +500,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc721::ERC721Component;␊ use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -510,6 +510,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -517,6 +518,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl ERC721EnumerableInternalImpl = ERC721EnumerableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -569,7 +571,7 @@ Generated by [AVA](https://avajs.dev). contract_state.erc721_enumerable.before_update(to, token_id);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -594,10 +596,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc721::ERC721Component;␊ use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -606,6 +607,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC721EnumerableComponent, storage: erc721_enumerable, event: ERC721EnumerableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -615,6 +617,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC721EnumerableImpl = ERC721EnumerableComponent::ERC721EnumerableImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -673,7 +676,7 @@ Generated by [AVA](https://avajs.dev). contract_state.erc721_enumerable.before_update(to, token_id);␊ }␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -681,7 +684,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -712,15 +715,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -728,6 +728,7 @@ Generated by [AVA](https://avajs.dev). component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -735,6 +736,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -786,7 +788,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -825,23 +827,23 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -898,14 +900,11 @@ Generated by [AVA](https://avajs.dev). mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -913,6 +912,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -924,6 +924,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -990,17 +991,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -1009,6 +1006,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1022,6 +1020,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1095,12 +1094,10 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1108,6 +1105,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1119,6 +1117,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1167,7 +1166,7 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1189,16 +1188,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::AccessControlComponent;␊ - use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::ERC721HooksEmptyImpl;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -1207,6 +1203,7 @@ Generated by [AVA](https://avajs.dev). component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1220,6 +1217,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ @@ -1274,7 +1272,7 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1299,14 +1297,12 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc721::ERC721Component;␊ use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use starknet::{ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1317,6 +1313,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1336,6 +1333,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1410,17 +1408,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1462,6 +1450,20 @@ Generated by [AVA](https://avajs.dev). self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` @@ -1478,12 +1480,11 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1492,6 +1493,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1501,6 +1503,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1557,7 +1560,19 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ impl SNIP12MetadataImpl of SNIP12Metadata {␊ fn name() -> felt252 {␊ 'MY_DAPP_NAME'␊ @@ -1567,14 +1582,6 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ }␊ ` @@ -1591,12 +1598,11 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ + use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1605,6 +1611,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1614,6 +1621,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1670,7 +1678,19 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ impl SNIP12MetadataImpl of SNIP12Metadata {␊ fn name() -> felt252 {␊ 'MY_DAPP_NAME'␊ @@ -1680,14 +1700,6 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ }␊ ` @@ -1712,6 +1724,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1719,6 +1732,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl VotesInternalImpl = VotesComponent::InternalImpl;␊ ␊ @@ -1765,6 +1779,10 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ impl SNIP12MetadataImpl of SNIP12Metadata {␊ fn name() -> felt252 {␊ 'MY_DAPP_NAME'␊ @@ -1791,17 +1809,14 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::governance::votes::VotesComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::DefaultConfig;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ + use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc721::ERC721Component;␊ use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ - use starknet::ClassHash;␊ - use starknet::ContractAddress;␊ - use starknet::get_caller_address;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1813,6 +1828,7 @@ Generated by [AVA](https://avajs.dev). component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ ␊ + // External␊ #[abi(embed_v0)]␊ impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ @@ -1832,6 +1848,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl VotesImpl = VotesComponent::VotesImpl;␊ ␊ + // Internal␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -1911,17 +1928,7 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ - ␊ - impl SNIP12MetadataImpl of SNIP12Metadata {␊ - fn name() -> felt252 {␊ - 'MY_DAPP_NAME'␊ - }␊ - ␊ - fn version() -> felt252 {␊ - 'MY_DAPP_VERSION'␊ - }␊ - }␊ - ␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1929,7 +1936,7 @@ Generated by [AVA](https://avajs.dev). self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ - ␊ + ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1971,5 +1978,19 @@ Generated by [AVA](https://avajs.dev). self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index af7502f5e79eb1c07788638d1d897432ded25273..29b46c4bfcdbc30b8923df13a1b6e920f3c6b42a 100644 GIT binary patch literal 3515 zcmV;s4Mg%mRzV_CjmCnx>4$t z6iE)^xGqa^XC>O)8I~N%k_{hv2+%`s?X5t8^j`Eo=>OB+dTTF5F#K8$Iplt5Ke*ht z2U}duyqS43ocaCUd;9oJ_tav>6ZcPlBi!T`@lJKuG!SKU&9l!Oy+iadAk-ymdmTc#*)@rSQG4%X zWn%;Fu%4}R^VA~fsmagLflcUF#I}iLQnbS;cXWfhsLLF*qni#xzu8=G++N>YS$X%N z%XQ}oB^+ZTEcj@p$2zEeb;6zyik`0^gplVF#B4&Jg;Fs#DR-D_6N8(KV(dD`Hpa(C zJKLf&j1tQ40h6Y>A82J8D@{_Y;!D;9@zVP$b0{v$26%mz+3M zxBTmOAL^%Ojr2}QN4wZuedK>>_G~NcLfgDFsTdRbDBXLEQ$;?EX78BmoP6AGagQci zObCy@&y%0LuNE$rgg@?}<1TkRgQMf%yKp&#<-F6dXe}P6_=Gc?Z9EiGA3}z|p5zHh z)qfFn*PoY1;YEiy<^`$kI?NUm7_IGK!h%ACdOhTSA&sVM>Ac^5Vznp+;(uSytsF0r z%m@+{@?s_2nuxzOWw)YNel2Z9?N>^=73qdSTo+^Zl!`qS`qDrCY^x8>?4cAvJGAug3!=SiTUw@bI*IxmD0saE~ z1^5f_7vL|zU(1cZ&N;VTys>enbMjQbTDMKAbA8>gnAh1b?XJ7=dCxe!eSYcCoyN&_ z^W?DiyDeA0OPcM*m3{Zi+n>;;`*f%C=_j{8+j)GixdDIkKtO?j0s#dA3Ir?M zOhB9XH&n#D4`~sIGV{xPdYX(6Pp?9#@8pJvhQTmxyO~bWUmlu3`L)IIOnXudYHEwberSYU`e>hOcjYCc)P`Z8a-0pLiJ zq4dlw^dFRpqw9E>vNVN4W{9hm2miIPe}&L`yq~KkY6>{LSjwo}p^B(q+M1QqGC91j zsy+tms0eLHY>B>|Ek?iU6T>g#BjQ5Za7wz&AzFxIC7jz=N2ZDRPhVuJfx0Axvy9@> z1(IM}zNdTQXwI#kM&=gbC_<~6D>{Qd3UurP@$gQX!N@h%qdh00K9q4yd`CL9ViE(a zZr-fUpQd3#cE?mmyflJ_q|p!4Kab9=hf!07Y_n%lu4bFB{#Rm~|9TbJW|e&*3q&M= z_En6T0h5{qlL7`bDFy@t2K*iii;!KtOEdxd@~EDyyi_5>v`v4>j!ozUxWwq#*6D{` zV)3o*t&j8R+!zxQuHgPK<4z~tGNKnFgLfgbJp;|{O-OP1I@nXG0Lk3ovDkr$qh<%M z|5joLpT7?5;Ck+)R4uUvscSOoMiN@_Y=CQO(u^Wk!v_Yt%e0<1$YqwDL|Ipy_1PEr&_?(HG&@EI%$lkgk5widM00`L}g9Cxh zL7-uU=w{jY;R3`o4x^!o6WrO5&vFM+E)+Gc5ScAkpk`^PbrnhRydyx%K+4O`st568 zG!p#=Ry`M1JzOBFq9V}o>NxBnq;;f_Ryzu5MYoW{EaEDDNcm66R`QSO{*cl?3{ZP- z|D<)K9Ua_jVHEoBgI$4$W8$6K%|r>Yn+MhIAO7;Fxm#RODkG{+z&sQD@7HA(#?PDn z^-ge|V3ND7yUqLePPFE3dvD+GKyI8X#M`FqDRFtvCJx5W6APd&Py7NIU-A}8EKXWk zv0SOz5?VB*@rO;QRf%z?>~-4O(R*a12IC5IvOdV8mqq3c0GR!Cn7w=!HlZe(DXV~2Eg&*GZi>6x^EG4=dox1d0{I`WE4iXltOI!$_uifU($PPrz) zWi5+;>arq=TTP0Rj{iVO!&jEzLOoXD0)}79V@wi+>_98Q?-nm0d%zSW7BU2A7b^04 z0otC!u5^oEA(M6)>X<%9?!bFwfLSgIS%hHdip3>E+%ROYTqF_((YWwS&dJ1SUjAG{ zW5jQ{6LCRwD|*bb@a(leNbv0HHGpR+cxJF(j|DJo>-Gl%r|kx6-C?wAp7|(E+=%7n zA~e8zkhxI=u0Y?*XKIg-rNK#Q%q%kI)KXLgjK!yLy5?|{N@b8svtfJ zXwtX=SJJvz91^u45mtHHtO%{DLcrEQ6;^`Osb;E}+6|ts*$})133bcPE08_^GylN3 zfjU}R;y2&$yBs~tkpvDKy*D5@4~@Yph|wc)v(^$OjC|C3ntzrj5?koTt7^ODirMIo}_ z4FqpsnTaEK1A!nG%K&d+wMZd&1DDMk*w}7tZL5=<1ZPyw8TNoej?;SR_ z+Jx(3(W^}fsY3|)se^UPB95jnoU0dJ$uS8lgi>5;Jtm|DD>fDu6fBe_Z!`%}{zeo_ z@{5(#Gy?Ai8E0TsF}F<0XJ6c6@F<0iq#nTNgcw7t|6GMqSb>rCO5L#tduhDwYyr(Cn5of{cJuWY$~dO>UKYY0U^0J5}`r98@f*0hRj* zFuRf<2#o&ECagj>BuO}LS?T`zTd2SGb6Lmhg(pa~aQ#I8I|72L_ zj!xY!akLA@O?swz)Z}hWZb5XWjv6IPqzo_0DSlDTFnv7r9GY)%mY+Lihr|6dT(`nP zit#hzu-a-eyK~l2&K_+xAyIa$im?)9hr~GI$AQrmMON43-TpQtTV|up zNd8tn4XNHEwN2WD@; zUqb6}iSxcAu)3BdgM6_RFm5hV9(z^wQkfLXoj)Heb5pj=mDVh_0Fi<-_;FvwxcNn+ zfR1}fI$n?DDR?=TcsT)H4!j(AIq-7e<-p5cUJkq*cscNL;N`%}ftOF%XMXt; znWYc>rQ*t;CAR+cN=e!J;*jq7v*6SoxH!ZY=;YEHrGyyVMS+EEIpfas8Tth2eP`OcUUa6t>ofEX+BZmZ)mi)z3oJlV`~%3t z8;RuZ+1;~$-*?X8!Pnhmiy6<{KmLhulUu|))?L#;l+l}>ed6dHq90qtbg6E;r;NLQ z_`1{4x&HXI-uEuOeo4H(^ZiRd`tBF6t*@iQ{jJY#J~RzNU2=1~Lnt@9CUG#@**;oX zUq>z0vvqDBTLe8f`6=4734KCrn^-1AEk?Pc8{9=*=Af2tIt+brYprp6?bgc5wa;Cy zJI^TL7#m^1rz<_yK|AM1>=~ixs}+P0@?3(LP3X%|D#j+|4s&f{aFbDtUB}qO`0${$ zDLTU_q5MuxO)lhOOdR8bjRwZ;gVqNdjf>TKz}Pdl-Lv`mcF(r%toU_}NYr~ZTj!@3 zrCO*XmorB{As7YH>WG{X%AUZYovEfI@;N- z)u;Z4X3w_5CU?viCKW?KchkL%h8h?7D4Nhiu5)rPY#||Rn{wh%-O7`f{9Y|gtO|cz zK}TKgcm_v@!Dr!$2+MiLVbNMVF7XPdDcg7`q&|cUe@V#-Pt|`Fb=TMX)9_7)IOZ9t zZ8^*q6BI4)U_ydIgnB*Xe;|#fYw5h-equE!2I7BS&#fFUfy@XJ732OJj0Q?(P9UO7 zQR1_jL%PT%Ru>~_zE%^x7hkUhYF{&{$xYodUlONwHQdNo>*(sv(XYjytKs5)weo5u zJe`PtI%Q9z%S<|retWs3r;%b~+Am-BO;qN+~L}C4?oeOC@&wCDs@D0HFjZdJwfX_2SS0b-ITgi4PSL=bf`U*hgg9qMBui?~|28l-xDi!lTl za6BcC0P&u6QS$Oi?aM^3yEIzZ`D3T#xn_u~PCM1zQ;gzkFFE|oSajDV4%Zm9&NY85 zwZy37(urLa{a=&YOVoOm#$%_)x=WDfmi+P=O)9$+Kzv&tKw@+U3FEMyldG%nnB0#^(D< z-Gs}-vpYH`HG$_aen}iwTkTh`qbzu+trp^2TlZWwzI}5;!nfDnEDgS$JA8GC;W;Kh z$2d|S#{1!aQ^LNb1+Z0trkVLkNQ!1LmKGJB5+YTKn+$fIH`t9d7fR1)y}wZw3`xhs zlBFpWFhdNjyyVBm`3r>1)0bBGq=RteYk)sbl;{?`|oYM?Gj;Vh%Lbb%zemcP?IarNd_ zPa|=Qa1^0a%@v(NcLN>!z&rdV%~s?ZYtfk#(HzRSCO#vbT0UU`_BK!U=19 z6d3|81MZGW0%lk55>24MJjN$0E>*}dZPQ<_7v^;WYhrY0>-3{8vG~U3#=U%2cY( z8lTx|{JA5SKM7QAul1YDF?kull~ko- zAlNK;m4SU_j*Nnn2BO&JLhF=gci}WaSloy_F|!LK3E&|cnn_*2L)P<#@sephZ;+=f zJBhNcIP0@5aGeeLlNK*><)9m=h+*nFA#ApS1e{}X!Ify;CTmmmVtnmok0)c#Aqa{4GelN40^a& zQ$QLAHa3tzXZ_E_U=*pKs(rb*v2UI z$p@za5!b_ewX2B|;uH_6J=*`(L369PqEtpyoq!o8`0LkY7RF8gZ7X;?(8iD>WUGC@ z`RL)1*4*0J-t{|MQiu9NMBm0mJexQef0bBXb$MC6s*cG~UWdURFpfPyz65fW4Agrh>YY8&@>M%W(i=B2 zFz~TMy1Hj^P4DzfTEMe<{)JgkAY2`JMJC0orDdI_%0)%B6Gx|96VSAlMMQO35yh=0 zMM>9tprqj|OK_kbtFVH>*zy>Y^ddXZ$}_|2g=Y_#p2Q-CaP2}xju)=&IqY1w_&G9Z zm!Xd7v+E8#lLm<90=xSmdb(nP%n)b{SuLx?$sl|ee&#uu;LaDnkN_I-Tkb^E5Z#Ej znIbXAza+%=w>JQ>rLdR5dOa3ku#MXvHZa}_wAx~{Yo3f+xqZ+Q{{UQEIJj8KtRQ*1 zlh&ZDJn>ahd*c0Kq0fPX5JT<{K+;vbgU66eyKJEJu*}6;XbMwcgj)x+lr9S?S+et$ z9&k#N%Yyvpli+2bUi^zyF)a(vA7-B>CTHyN6``7j>AHc`d?f283h}Y#5QCU!Q}_0a z5=ANWB^Au;a~*Box&=(AmsBdyktBj~+|C zljf*`WPL6Hk$w99b0vK@JeRXxkstHQ4MSq8oz(MqFnhu)6DE5}pH`_t{Q(CKvit3}w$OZVUTr9}7NeWx^TQ-e7K zW9s!V_S56I7(XEn8$`!P_N$(-GXYJgAeU#13%dEK_%lU^>?EEeQsE%z@g8ErP0PjD zaL#ScP8{7nJ;#_bYKV#3_5WT>hD%Mmv4Qd7?)H9TV~22EY>?5c2yqcVU9)ak#L@Js zIgjBfCzG&FD8;4LXF^)Af@5Jp!9rQ`A(as2A7Zg2zgSsJCh)kGiwta0%rKLR0w``V z*g9b&sSOw15El^Z@1szvy!Ar7FheWRaz96BA~vVgyvnlD^Sdn8t0j37&#*?YVksf! z%pNf#$O!mGX1y)EDQ@AO12lpqPgOku_Y@0iK;=Hd%dR8{cp3W%MrfR$IiRe)3?6|L z7g?xBAVmYP9dc$e&kX{5qRt2JG}f)7b8whk%=6=gK;jKZya9> { + yield* generateAlternatives(blueprint); +} + diff --git a/packages/core-cairo/src/generate/sources.ts b/packages/core-cairo/src/generate/sources.ts index 9d99d8986..3ff9365ce 100644 --- a/packages/core-cairo/src/generate/sources.ts +++ b/packages/core-cairo/src/generate/sources.ts @@ -7,6 +7,7 @@ import { generateERC721Options } from './erc721'; import { generateERC1155Options } from './erc1155'; import { generateAccountOptions } from './account'; import { generateCustomOptions } from './custom'; +import { generateGovernorOptions } from './governor'; import { buildGeneric, GenericOptions, KindedOptions } from '../build-generic'; import { printContract } from '../print'; import { OptionsError } from '../error'; @@ -47,6 +48,12 @@ export function* generateOptions(kind?: Kind): Generator { yield { kind: 'Custom', ...kindOpts }; } } + + if (!kind || kind === 'Governor') { + for (const kindOpts of generateGovernorOptions()) { + yield { kind: 'Governor', ...kindOpts }; + } + } } interface GeneratedContract { diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index ad16ae3c1..e8752048f 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -1,5 +1,5 @@ -import { contractDefaults as commonDefaults, withCommonContractDefaults } from './common-options'; -import type { CommonContractOptions } from './common-options'; +import { contractDefaults as commonDefaults, withCommonDefaults } from './common-options'; +import type { CommonOptions } from './common-options'; import { ContractBuilder, Contract } from "./contract"; import { OptionsError } from "./error"; import { printContract } from "./print"; @@ -29,13 +29,15 @@ export const defaults: Required = { quorumPercent: 4, quorumAbsolute: '', settings: true, - access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, appName: 'OpenZeppelin Governor', appVersion: 'v1', info: commonDefaults.info } as const; +export const quorumModeOptions = ['percent', 'absolute'] as const; +export type QuorumMode = typeof quorumModeOptions[number]; + export const votesOptions = ['erc20votes', 'erc721votes'] as const; export type VotesOptions = typeof votesOptions[number]; @@ -45,13 +47,13 @@ export type TimelockOptions = typeof timelockOptions[number]; export function printGovernor(opts: GovernorOptions = defaults): string { return printContract(buildGovernor(opts)); } -export interface GovernorOptions extends CommonContractOptions { +export interface GovernorOptions extends CommonOptions { name: string; delay: string; period: string; proposalThreshold?: string; decimals?: number; - quorumMode?: 'percent' | 'absolute'; + quorumMode?: QuorumMode; quorumPercent?: number; quorumAbsolute?: string; votes?: VotesOptions; @@ -69,7 +71,7 @@ export function isAccessControlRequired(opts: Partial): boolean function withDefaults(opts: GovernorOptions): Required { return { ...opts, - ...withCommonContractDefaults(opts), + ...withCommonDefaults(opts), decimals: opts.decimals ?? defaults.decimals, quorumPercent: opts.quorumPercent ?? defaults.quorumPercent, quorumAbsolute: opts.quorumAbsolute ?? defaults.quorumAbsolute, From 0e5efbb6a4f57f792837b755bf26379508fa4a7e Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 12:59:15 +0100 Subject: [PATCH 15/20] feat: add tests --- packages/core-cairo/src/generate/governor.ts | 4 +- packages/core-cairo/src/governor.test.ts | 180 +++ packages/core-cairo/src/governor.test.ts.md | 1383 +++++++++++++++++ packages/core-cairo/src/governor.test.ts.snap | Bin 0 -> 2279 bytes packages/core-cairo/src/governor.ts | 4 +- packages/core-cairo/src/test.ts | 2 +- 6 files changed, 1569 insertions(+), 4 deletions(-) create mode 100644 packages/core-cairo/src/governor.test.ts create mode 100644 packages/core-cairo/src/governor.test.ts.md create mode 100644 packages/core-cairo/src/governor.test.ts.snap diff --git a/packages/core-cairo/src/generate/governor.ts b/packages/core-cairo/src/generate/governor.ts index 8e93d6ac0..8ffee9aef 100644 --- a/packages/core-cairo/src/generate/governor.ts +++ b/packages/core-cairo/src/generate/governor.ts @@ -7,8 +7,8 @@ const booleans = [true, false]; const blueprint = { name: ['MyGovernor'], - delay: ['1'], - period: ['1'], + delay: ['1 day'], + period: ['1 week'], proposalThreshold: ['1'], decimals: [18], quorumMode: quorumModeOptions, diff --git a/packages/core-cairo/src/governor.test.ts b/packages/core-cairo/src/governor.test.ts new file mode 100644 index 000000000..5b0e0422d --- /dev/null +++ b/packages/core-cairo/src/governor.test.ts @@ -0,0 +1,180 @@ +import test from 'ava'; +import { governor } from '.'; + +import { buildGovernor, GovernorOptions } from './governor'; +import { printContract } from './print'; + +const NAME = 'MyGovernor'; + +function testGovernor(title: string, opts: Partial) { + test(title, t => { + const c = buildGovernor({ + name: NAME, + delay: '1 day', + period: '1 week', + ...opts, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: GovernorOptions) { + test(title, t => { + t.is(governor.print(opts), printContract(buildGovernor({ + name: NAME, + delay: '1 day', + period: '1 week', + ...opts, + }))); + }); +} + +testGovernor('basic + upgradeable', { + upgradeable: true +}); + +testGovernor('basic non-upgradeable', { + upgradeable: false +}); + +testGovernor('erc20 votes + timelock', { + votes: 'erc20votes', + timelock: 'openzeppelin', +}); + +testGovernor('erc721 votes + timelock', { + votes: 'erc721votes', + timelock: 'openzeppelin', +}); + +testGovernor('custom name', { + name: 'CustomGovernor', +}); + +testGovernor('custom settings', { + delay: '2 hours', + period: '1 year', + proposalThreshold: '300', + settings: true, +}); + +testGovernor('quorum mode absolute', { + quorumMode: 'absolute', + quorumAbsolute: '200', +}); + +testGovernor('quorum mode percent', { + quorumMode: 'percent', + quorumPercent: 40, +}); + +testGovernor('custom snip12 metadata', { + appName: 'Governor', + appVersion: 'v3', +}); + +testGovernor('all options', { + name: NAME, + delay: '4 day', + period: '4 week', + proposalThreshold: '500', + decimals: 10, + quorumMode: 'absolute', + quorumPercent: 50, + quorumAbsolute: '200', + votes: 'erc721votes', + clockMode: 'timestamp', + timelock: 'openzeppelin', + settings: true, + appName: 'MyApp2', + appVersion: 'v5', + upgradeable: true, +}); + +testAPIEquivalence('API basic + upgradeable', { + name: NAME, + delay: '1 day', + period: '1 week', + upgradeable: true +}); + +testAPIEquivalence('API basic non-upgradeable', { + name: NAME, + delay: '1 day', + period: '1 week', + upgradeable: false +}); + +testAPIEquivalence('API erc20 votes + timelock', { + name: NAME, + delay: '1 day', + period: '1 week', + votes: 'erc20votes', + timelock: 'openzeppelin', +}); + +testAPIEquivalence('API erc721 votes + timelock', { + name: NAME, + delay: '1 day', + period: '1 week', + votes: 'erc721votes', + timelock: 'openzeppelin', +}); + +testAPIEquivalence('API custom name', { + delay: '1 day', + period: '1 week', + name: 'CustomGovernor', +}); + +testAPIEquivalence('API custom settings', { + name: NAME, + delay: '2 hours', + period: '1 year', + proposalThreshold: '300', + settings: true, +}); + +testAPIEquivalence('API quorum mode absolute', { + name: NAME, + delay: '1 day', + period: '1 week', + quorumMode: 'absolute', + quorumAbsolute: '200', +}); + +testAPIEquivalence('API quorum mode percent', { name: NAME, + delay: '1 day', + period: '1 week', + quorumMode: 'percent', + quorumPercent: 40, +}); + +testAPIEquivalence('API custom snip12 metadata', { + name: NAME, + delay: '1 day', + period: '1 week', + appName: 'Governor', + appVersion: 'v3', +}); + +testAPIEquivalence('API all options', { + name: NAME, + delay: '4 day', + period: '4 week', + proposalThreshold: '500', + decimals: 10, + quorumMode: 'absolute', + quorumPercent: 50, + quorumAbsolute: '200', + votes: 'erc721votes', + clockMode: 'timestamp', + timelock: 'openzeppelin', + settings: true, + appName: 'MyApp2', + appVersion: 'v5', + upgradeable: true, +}); diff --git a/packages/core-cairo/src/governor.test.ts.md b/packages/core-cairo/src/governor.test.ts.md new file mode 100644 index 000000000..e4ef89356 --- /dev/null +++ b/packages/core-cairo/src/governor.test.ts.md @@ -0,0 +1,1383 @@ +# Snapshot report for `src/governor.test.ts` + +The actual snapshot is saved in `governor.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## basic + upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## basic non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::InternalTrait as GovernorInternalTrait;␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::ContractAddress;␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## erc20 votes + timelock + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## erc721 votes + timelock + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## custom name + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod CustomGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## custom settings + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 7200; /* 2 hours */␊ + const VOTING_PERIOD: u64 = 31536000; /* 1 year */␊ + const PROPOSAL_THRESHOLD: u256 = 300e18;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## quorum mode absolute + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM: u256 = 200e18;␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl VotesTokenImpl = GovernorVotesComponent::VotesTokenImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorVotesImpl = GovernorVotesComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // Locally implemented extensions␊ + //␊ + ␊ + impl GovernorQuorum of GovernorComponent::GovernorQuorumTrait {␊ + fn quorum(self: @GovernorComponent::ComponentState, timepoint: u64) -> u256 {␊ + QUORUM␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## quorum mode percent + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 400; /* 40% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'OpenZeppelin Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## custom snip12 metadata + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesQuorumFractionComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesQuorumFractionComponent::InternalTrait as GovernorVotesQuorumFractionInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ + const VOTING_DELAY: u64 = 86400; /* 1 day */␊ + const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const PROPOSAL_THRESHOLD: u256 = 0;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorQuorumImpl = GovernorVotesQuorumFractionComponent::GovernorQuorum;␊ + impl GovernorVotesImpl = GovernorVotesQuorumFractionComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesQuorumFractionComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v3'␊ + }␊ + }␊ + }␊ + ` + +## all options + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + ␊ + #[starknet::contract]␊ + mod MyGovernor {␊ + use openzeppelin::governance::governor::{DefaultConfig, GovernorComponent};␊ + use openzeppelin::governance::governor::extensions::{␊ + GovernorCountingSimpleComponent, GovernorSettingsComponent,␊ + GovernorTimelockExecutionComponent, GovernorVotesComponent␊ + };␊ + use openzeppelin::governance::governor::extensions::GovernorSettingsComponent::InternalTrait as GovernorSettingsInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorTimelockExecutionComponent::InternalTrait as GovernorTimelockExecutionInternalTrait;␊ + use openzeppelin::governance::governor::extensions::GovernorVotesComponent::InternalTrait as GovernorVotesInternalTrait;␊ + use openzeppelin::governance::governor::GovernorComponent::{␊ + InternalExtendedImpl, InternalTrait as GovernorInternalTrait␊ + };␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin::upgrades::interface::IUpgradeable;␊ + use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const QUORUM: u256 = 200;␊ + const VOTING_DELAY: u64 = 345600; /* 4 day */␊ + const VOTING_PERIOD: u64 = 2419200; /* 4 week */␊ + const PROPOSAL_THRESHOLD: u256 = 500;␊ + ␊ + component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ + component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesComponent, storage: governor_votes, event: GovernorVotesEvent);␊ + component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ + component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ + component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl VotesTokenImpl = GovernorVotesComponent::VotesTokenImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Extensions (internal)␊ + impl GovernorCountingSimpleImpl = GovernorCountingSimpleComponent::GovernorCounting;␊ + impl GovernorVotesImpl = GovernorVotesComponent::GovernorVotes;␊ + impl GovernorSettingsImpl = GovernorSettingsComponent::GovernorSettings;␊ + impl GovernorTimelockExecutionImpl = GovernorTimelockExecutionComponent::GovernorExecution;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // Internal␊ + impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + governor: GovernorComponent::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + #[substorage(v0)]␊ + governor_counting: GovernorCountingSimpleComponent::Storage,␊ + #[substorage(v0)]␊ + governor_votes: GovernorVotesComponent::Storage,␊ + #[substorage(v0)]␊ + governor_settings: GovernorSettingsComponent::Storage,␊ + #[substorage(v0)]␊ + governor_timelock_execution: GovernorTimelockExecutionComponent::Storage,␊ + #[substorage(v0)]␊ + upgradeable: UpgradeableComponent::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + GovernorEvent: GovernorComponent::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + #[flat]␊ + GovernorCountingSimpleEvent: GovernorCountingSimpleComponent::Event,␊ + #[flat]␊ + GovernorVotesEvent: GovernorVotesComponent::Event,␊ + #[flat]␊ + GovernorSettingsEvent: GovernorSettingsComponent::Event,␊ + #[flat]␊ + GovernorTimelockExecutionEvent: GovernorTimelockExecutionComponent::Event,␊ + #[flat]␊ + UpgradeableEvent: UpgradeableComponent::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes.initializer(votes_token);␊ + self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ + self.governor_timelock_execution.initializer(timelock_controller);␊ + }␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + ␊ + //␊ + // Locally implemented extensions␊ + //␊ + ␊ + impl GovernorQuorum of GovernorComponent::GovernorQuorumTrait {␊ + fn quorum(self: @GovernorComponent::ComponentState, timepoint: u64) -> u256 {␊ + QUORUM␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MyApp2'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v5'␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core-cairo/src/governor.test.ts.snap b/packages/core-cairo/src/governor.test.ts.snap new file mode 100644 index 0000000000000000000000000000000000000000..484c0722f939447e383895632f7fc944287b2430 GIT binary patch literal 2279 zcmZ{ecQhM{0>-)8*rPRyn$=QLqh_zIjT%w2R)Us@qDqR!ja{|X7HaQOVg;!^E~11e zDu`V%S|dhlzUaH>o%7DU=biJu|9;>1{qfVY(G#=sc1HNQ`}m6?l~@?)j0gZwR%T-9 zW2LeYLzLl*e?iFPPc7X8HMPR}Uvp3{q6tiN{|Up+!j8|pvJm4Q{ryj^mZ(EsRG7TDI#XXj%b zIe~V5dUX(~-H7dGG!O|e9eDD~{F`xdyacp`qt)R4uY2|9U$hS@f$w$_xa9^4!;a5! zO<`w<{Te8B-crY>BV>!FrgK(5F1A1$70p6A#3<@z;m$LR0+uIwZnV$EuqFa#mme%; z?xq?H`PmkvXcb}$KTxg4;I40!1ZI+WTzeR>&h7M4-Kx}&T^&mfb}h7o6eMD}vgwYL z^of`Ar*qfi?I7(E`c-;VgD#VJaZ%)X1}*gx4zpSrJ}Q)RL1Z8VHW)D?H;34XfZdn* zWzLT!elImCsB^q6LUXi~bRb5;2V_wJLW-^v@Il9b%^+p40&%w7Qux~H1Gn%80ftj5 zcv_yf_|4Okf}5`6~t(U3`#EC z_7=v7?h4!8^s2+8#gt7tNF)+c|^pU}3I@-I8HxA_B1Yi+R+8sFrDC{KA{4XeyOGO}TwwP-CV>73`a z0;QH@tVZYUV?*@Vt)!C2!&!v_ENQW2=5l6`cFQWPkz}EjWOOhj)gzI{uZ?~_lf&S6|19T9n$E_6=57!>N*@@6C{{|V5VdSzBK zMI@IjjnzK~aJml!NlZ)mqQK|QZ5RPY51ei{g0#xI}$ z-oVyOZydotcvX=}*r;v)+0d$)rJSa5JPG^dyA)KGFMr^sdFTB+_u{PQ!9UMhTT$!% z7rrZ{-#(JJX}-)8A3nO`LtA@JPn(BLLW&*884yjHDM-UC$XS`D4Zhf%>=7O(yYqf)It_HJwv zl$V`FYsgHxQL=CyUyi-5a3HyhV!^V2XAyaL2>+L>-fAtYV^A+|yq|&Y@#fg+% zZ_8Z*un5`#u?ML%*m5s3?&T`&0lff6o_}6-j;jZ4PhGN)xbxRScNWOtZo#rWHFB*@ zASu2xhw`2}6>Q3|k$_~yu|cC{`!byg_3#-*FM+>t?W95QFOvL6pPr2i{vLV%!1)X2 zH!~+i&C~Si14?3Lssj9-qKUwJHmhjqz6|H#|A$==tMxeP3R+VS8X64@iw^nkGuXrG zq9p$Wk(;-tz{P8hYHh}LkVouJ-;(v_>3>#&IImGSi(bfMM{YA zwnT5IIo}J13liNrobFJQPRa1pI?Wdj0$hK>s7f@%<)_@~U0j`>jS>HI8WdSt?ORD& z(a)(!%yZM5q2`gPkKbJ$h;Y$ssLOMCUDq=W9I!w;vhF7e74SFC(iEYCdYnjwf8EbnftES zj}-5MEju1DqH$i798sHH=<*;6(e*6+aFA{TMfYsm9iQa(`3HK^eD1yoR9Wa=xDZ%8G5Fv{Q;h=0Ex{ph2_9Erfq1gE- zwsh5N%Lju1xo$=WfE+{CYeEmaBSN5w4FZsTlc`52f`3+Y{~Iqy=@N?8fF*0cK { return { ...opts, ...withCommonDefaults(opts), + delay: opts.delay ?? defaults.delay, + period: opts.period ?? defaults.period, + proposalThreshold: opts.proposalThreshold || defaults.proposalThreshold, decimals: opts.decimals ?? defaults.decimals, quorumPercent: opts.quorumPercent ?? defaults.quorumPercent, quorumAbsolute: opts.quorumAbsolute ?? defaults.quorumAbsolute, - proposalThreshold: opts.proposalThreshold || defaults.proposalThreshold, settings: opts.settings ?? defaults.settings, quorumMode: opts.quorumMode ?? defaults.quorumMode, votes: opts.votes ?? defaults.votes, diff --git a/packages/core-cairo/src/test.ts b/packages/core-cairo/src/test.ts index e86519798..a6d7fce7c 100644 --- a/packages/core-cairo/src/test.ts +++ b/packages/core-cairo/src/test.ts @@ -63,7 +63,7 @@ test('is access control required', async t => { for (const contract of generateSources('all')) { const regexOwnable = /(use openzeppelin::access::ownable::OwnableComponent)/gm; - if (contract.options.kind !== 'Account' && !contract.options.access) { + if (contract.options.kind !== 'Account' && contract.options.kind !== 'Governor' && !contract.options.access) { if (isAccessControlRequired(contract.options)) { t.regex(contract.source, regexOwnable, JSON.stringify(contract.options)); } else { From 3a62081e397c8f770ff0b4cbcbd1d8ec6938a674 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 13:21:43 +0100 Subject: [PATCH 16/20] feat: remove e notation --- packages/core-cairo/src/account.test.ts.md | 72 ++++++ packages/core-cairo/src/account.test.ts.snap | Bin 1774 -> 1784 bytes packages/core-cairo/src/custom.test.ts.md | 36 ++- packages/core-cairo/src/custom.test.ts.snap | Bin 1339 -> 1352 bytes packages/core-cairo/src/erc1155.test.ts.md | 244 +++++++++++------- packages/core-cairo/src/erc1155.test.ts.snap | Bin 3389 -> 3417 bytes packages/core-cairo/src/erc20.test.ts.md | 212 +++++++++------ packages/core-cairo/src/erc20.test.ts.snap | Bin 2752 -> 2779 bytes packages/core-cairo/src/erc721.test.ts.md | 192 +++++++++----- packages/core-cairo/src/erc721.test.ts.snap | Bin 3515 -> 3528 bytes packages/core-cairo/src/governor.test.ts.md | 242 +++++++++-------- packages/core-cairo/src/governor.test.ts.snap | Bin 2279 -> 2332 bytes packages/core-cairo/src/governor.ts | 17 +- packages/core-cairo/src/print.ts | 5 +- packages/core-cairo/src/set-upgradeable.ts | 1 + 15 files changed, 661 insertions(+), 360 deletions(-) diff --git a/packages/core-cairo/src/account.test.ts.md b/packages/core-cairo/src/account.test.ts.md index a9682bd8b..9240e2b90 100644 --- a/packages/core-cairo/src/account.test.ts.md +++ b/packages/core-cairo/src/account.test.ts.md @@ -57,6 +57,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -166,6 +170,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -279,6 +287,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -398,6 +410,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -467,6 +483,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -538,6 +558,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -609,6 +633,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -682,6 +710,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -755,6 +787,10 @@ Generated by [AVA](https://avajs.dev). self.account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -819,6 +855,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -930,6 +970,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1045,6 +1089,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1166,6 +1214,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1236,6 +1288,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1308,6 +1364,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1380,6 +1440,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1454,6 +1518,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1528,6 +1596,10 @@ Generated by [AVA](https://avajs.dev). self.eth_account.initializer(public_key);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ diff --git a/packages/core-cairo/src/account.test.ts.snap b/packages/core-cairo/src/account.test.ts.snap index 276a6b33b2db0a019466184f1f7a943bdb8c1c70..8b076020bae420911fe82c4604912d094f4325ac 100644 GIT binary patch literal 1784 zcmVt2AOiZT6*$nmTHtH z&1D~IDj$mo00000000B+oxg7*MHI&aT$IG3p#t%9qH7#*oLr;970Xg?Ql^cZM$o8@($^E z_kG%AwBay2;M5CRt_Z$*)NE2gKVK3rEG#YbU(YQry!1R<+Snk+M|+>Ge`1@A2WU>ysL_eV5$Z ztloI9x>+h+zZ(eZpK>M)!wegi!y8^ZDYe}uIqdBYkIBOlA%t`SMqH2a2jKvQ5w$vVX(kn#sa(R!U?Zsu>52MFt3$t%Myy># z(;uv)lklL)eEW=*_k7o@Nc(BHwuX%u@3hI_gyJ2`p(42(dDG||Gq_Nh*gf7VV;;%q zIJzGuxk54%JHmAN@W1c+LxUD4(z&wFED|usGKjK}D#YtF9NVm)vYtUK=7_EBtu@Iv z{XW%jkyLGN3!6Ij1Ll{Leqltoi1tymour$WuVid#d6V>yU5m(Jc4Qw&cWUuy8BLxn zXXkaZA71M%8ng@&hgx~cW7DQVzD~+Wk9Q|EZhm(3;gdV#nMVWg& zJ#%xHucv13Yo3z5>9sk{-ucX!vzXQjmVk<%GIAB`lgRZp>w1oD+7KNO9S|LPiOyP{ zg6M$gfarkeh*EboBXvV{Ky~CSuN5o<6+dU>D%dBX>(vGgY%|$MsbOmQH6={FxICv} zO5YPIBabTM_;&5xi6Jt&sKx$tn>E^I&MofrQjIIEo_v(;(D-O*46i^8K@3ejvFSQO z49%|?dUJ#*GR4p0%L-L2FU~1dwAhA>a^j2skv;IMjW8^u47@`Xij*6f*h+WCSt-85Qw;COjSj4}piY z9l=B3A&H05o)oRzRCuVm0v-YnfrkpnLwE`W>H>9vxbwYggf}EpQjO z3*1%Ij}n2sz+PZ4uou{C3hY%;3Z^pA+KtlkCfybuKW8JqjZ|tT2n8L~(1zW@Nd31sI0 literal 1774 zcmVO z%riSrW}fHwU$39scRHSL??v}sdBB7#Jhs2uWey#9f;a=uBhI3u8IRc7 zPM2}vIxY(>a&hO2TC+)7em|hX?RbpbaYc_@3K;*21p)J1PFg+}A+<$B96uy2>V`hK zxv_rc-19juq-=nSdVXb^+v7lcge+r3*%$*b&U{01`#8E!1&#G0LzNo zTUOj~cso94T%4cM!Q~?Kqk!4M^|@t5p}lEYyH{G9r9ETUMI#$5bg0cNYv*d_(DIH_ zW6f}xJ6ax%qK|3RJ6{`JwUfpt>j4!#i{xk9Ad&DxdW%`vpPb!hT%=96hexaD_2!iM zOSXpINevAf6$Kz6S--=&?b{oxH%2Gj ze&8k3yEt6mJHr$2O*kiA9BHF>lZCk}s9^7BgYIx?P}zQRVd@Zag9-DgHEF&%i#q3( zSdBdsJ9zAqNQ47hklpdQc-zG72A#NRJ$2#mC)q-pNyTOw4`F4rk<^9sNd2YNp4o3 z9x3UV-w)GVA(=@XVf%di*Z0G*L5CCRTs>qCiJ0eDL|I4;5)3+?Yq$5e-{WZmViaH;3sWnn$*7e|EjR;F!MdHD~IeTT>aG`GT~dvJKNK&DTFvpa2j z7&zNK8ucua22pu36BD9Q#6r>bxp&YWUZ}@&Q5s8&Gx@!)4kz_GjD2xfOLFpBaZctw zUn|VZ#{wlU(_;&om#diz=P_X!mRihD29=89S>!s+_5;tgUC0T@3CM}6L}x8eK~6wU zKu#=zoLDbO%Fq+g6BWx?hUFIXvq7c8cow=|?a;`zvwc*oAO2Iq)IZP<&<|DD54%@d z?@SGm$we*D7u#&nKJzYd@1W4Q((2Ji*^G_nLt}geG6yo}nI|?~N64IclsRwaSfNzb zEWfPq!pic3@Vx=`!1+Aqyu%=*s6x2>oznK|`p% zCnOgn*HLDQt#}_!9YAhid=}F3EaV*I9OT>r$hk0skHGT}^a^g}s)8RM0Y88rz>nGC zN3s(O07PyA1Ob8oL4Y8pBgoicWRD$a5ad?{L4E>)06~BtvqF%|qn-E(n?8cl;&H8y zZn1obv>8ALpaakW=okt*`>*Fe>1h-{cKKOho(EtaFb|l=#7}+jNC%_?(gEo#GU*gO z-8qqaMeqbj2c!eiF_3id*K|sV>NSO^UIbBrs6bSvzOnt~qin1Q_N^RK;lsAJC?b5U*4Mfxh-t^&+Vou z?wMN%kOS=m2}sLkerQ0R)YBk>jZz{guj2QwLIr=DRK>4~R8aLyya4Ia%)~Y?si>Mc zMEW-hYTZ-FD99+tsD;Q2T4IEZf{cQUT5K70rW^^NqoAXpqfE$b^OB3InMAUn`Np`g zsvIl}1LR6y36M8U`g&Lu1EjtubW^o;ll0P%J`^6^dqY$0SEej2v>mh^v>mkFEVbRq zNlYm(0sp;%D&Lq?0=|l3`_^61Ji-&@`(1-zip&_RjY*RepIOL2T&cT4pe6z)y@0~7sw7|2eQ+%703=` QHxsh^A0FZ#m>j(T08eC8ga7~l diff --git a/packages/core-cairo/src/custom.test.ts.md b/packages/core-cairo/src/custom.test.ts.md index a31e5cb46..6ac3716ea 100644 --- a/packages/core-cairo/src/custom.test.ts.md +++ b/packages/core-cairo/src/custom.test.ts.md @@ -66,6 +66,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -132,14 +136,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -155,6 +151,18 @@ Generated by [AVA](https://avajs.dev). self.pausable.unpause();␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -205,6 +213,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -277,6 +289,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -350,6 +366,10 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ diff --git a/packages/core-cairo/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index 80e058dc9b76f7f2bbae8188974dda3c64baf930..4e9ad5ff9ed49816839fe396c330a2728ead7b72 100644 GIT binary patch literal 1352 zcmV-O1-JS^RzVK}^;00000000B+TFY+ZHWW=;G)27Y2NdAUpnwB7aXLU2WjX}{Cv6QRO^^pL z=^zzo=_)27QvylnF@Xzo*G)fS`UU-ieoOaVbl*)OiIhn_@w*v%hvzJwG>muBAMtQP228G1II5Wz7*i&J`@{u|yNBcXzuD0+F6nLz>Z%hEA$}mD z-^wzv?s*)97_BuD2Uq*QXhuZ#F)EAQLTa8dGU~L2;0&0wTsGq;i)-bf^BFS2sw`$9 zm8lMw#A~b63O9EpR zu62uOdX1ETv7(Ih@RKSyRt*n0J%i>352Kb*+-Ys3M!<#xlsvG|`2msRQRK_C3Rv>8 zRT;)C%`!xWdxpmiSvmT-*B(LfoyEvp1CQ${5v z0eug=nYgN@IMT(eYuZ3=zPVvtnROqxLm!zNSFRY1LHbNrR5erv=Z+iiS5BXZK1SKz zWuh%0CPDz0PRN2wCqdj)kS%MYob~Uf-Jjt#%JWt~B12Ki%ts6VT7>oY!VD6Y0C&i# zyu?`N0pnfu>$$UC0f)g!8f`{O+IT`FH$ghSBY$e3ih>GB8qa?vqdgrtXG61jv;@Q> z((+`a!vm3hwyevNGy$4_Sm`lY(O|9l(gZ!6TqtwDhiI8L)$!`x2{7P9f+IPh*%ZYa zLaI!z zPOS;=uL)1DJFuzGF`i!8)#n)XIYxbsQJ-VfoRx9bdAir5gd@TLc{Gs--pqb*ILiT6 z$*%c&3i)~#&P^uG*Ry{VF^fkC^$9@D*Z1OUnWHZr22k?Re4%BL*B6uh29cBxI^6w! zZ+&BP&)M7A+Qi6*K)zmmjo!qtAug>K&6k$V%Xl|^5aLV!tDInbwVt#)Y1`QAH#Wap zKioQS);G4hKPF=sRWTfmeMJPWq+$HQgS)F3@9%Y1pAV^K_QMD`##ZjDD7Pwe8B1EJ z&Un&tyOxBl6dG~k1ZUx5qv@k^3#3Wt zyX2m+XechS>LlGDAhHEk$j%cgkF1j_Ud{~EZ83*<1Ih}Lq?Mn)qH0M^3fjf0Kuf{s z-J-(OIpKs!CuZYjkz`u-fDL}XA(XXcw=y_0tEB8qn0l(1j)&J)7hmcxB&h(p?a|25 z{C}3(`ezo83hsF0V?4y%%6ksCF7Buc>Z=h`deZ;cml$T}+QGD)7S#6zru4qRsPR8# K(gsq(FaQ8uCyc!S literal 1339 zcmV-B1;qM6RzVY00000000B+TFY+ZHWW=;G;O@=A8@89-~djX4vvElCrh6#MgKnf zbm@za|6FRf(b2*7>Dn%}feBdaIlv@!DR7MTddH1+8+H9*KqT#ZfUc<=p#1>Y&kzLQ zQHHuclbqO6AlK)pODOlzuN&)Mf3v>PXngsLkc3|{kQm#_@Vqhf9kh3wI-G%wo+^TR?D=jdlOaga_4H)-M#_RvEqh?$(+!)kd*CRswNW`F( zG0|}x4nmB!8nJ_&`oC%hL=G@2i`_zMoiWn#w1wabm^55=qC2Zw<)QNoX<-$MSx9A? zhKu91+i2%T0%yci*+=@c3Bx`(*44&pl7n;@c&Yauy`iiZ-FRCVJ6o^J=-ZT`BS|ED zHy*Udv_a$e8sPLxHB1?M80$ubVe+%iMJ!JI-e`}mOJx`Km1#4hFwUbfj`EbiScPjn zB3fD_C18vwqjdUl7M!aK2ROZg<~H|(mX_Q}ZX`y)!Xb)p80cJ&$nh-lX<7v={<2jW zMo-N$M4Ees$M#vW2tH2&xeRIdnjBmtz;iJ&*0U8c7j1R9;$78HMsDkh;C0HVq{O4| zfHz}TRf^d}swzg$=;+#ak-jD6(o7rPWofQdgJ5uN+0jm94TuEKLQ*u+|ba{oFLi)4WD`MH&Po6s4Mbw(^%DMITlcP>KZDA*b>dI)NncSqtQF$Jo`r9jen{VTQV7qVxYVLH@(9pB}B2QBsa z!^`(=_4z}6{!pJk)aMV2+%IHmbe-(tDBk^j4>>eeGG}2Q0bJz(E3#`PoU_+ENubQt7o7d4kIT1-q{#Tq}eAkJuyUDe-i*N6I-#OVmwmRE;y`SPa zjHgofqsWvO%hJIWtgiW?94;QdVd-TKV-W_9KZ&p(`;m(CAIl-J-(Oy5NLKD^lZT zQDj=?gf)GCAe6CXw=y_$*dv)3^-ie>bn;!(%~$E+d(zrG_Bi8g`Cp@t`g;+7-aql} xit!Y4H8l@!I6P7D>(>xw^xXZqUl>@NNBpz*3%`C8J)@7J{{xzh?_UTo006AxiLC$t diff --git a/packages/core-cairo/src/erc1155.test.ts.md b/packages/core-cairo/src/erc1155.test.ts.md index 2f45791af..ae5b7a497 100644 --- a/packages/core-cairo/src/erc1155.test.ts.md +++ b/packages/core-cairo/src/erc1155.test.ts.md @@ -139,14 +139,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -161,6 +153,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -242,14 +246,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -264,6 +260,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -330,6 +338,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -403,14 +415,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -458,6 +462,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -546,14 +562,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -580,6 +588,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -646,14 +666,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -703,6 +715,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -787,14 +811,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -844,6 +860,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -910,14 +938,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -932,6 +952,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1016,14 +1048,6 @@ Generated by [AVA](https://avajs.dev). self.erc2981.initializer(default_royalty_receiver, 500);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1038,6 +1062,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1136,14 +1172,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1158,6 +1186,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1246,14 +1286,6 @@ Generated by [AVA](https://avajs.dev). const FEE_DENOMINATOR: u128 = 100000;␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1268,6 +1300,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1370,14 +1414,6 @@ Generated by [AVA](https://avajs.dev). const FEE_DENOMINATOR: u128 = 100000;␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1392,6 +1428,18 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1727,14 +1775,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1829,5 +1869,17 @@ Generated by [AVA](https://avajs.dev). self.set_base_uri(baseUri);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/erc1155.test.ts.snap b/packages/core-cairo/src/erc1155.test.ts.snap index aaa852fc1441556bc6f0767cdb058bd1d3650fd6..6a21be873c8aebf4c7f3aebd0097f0ec9833387f 100644 GIT binary patch literal 3417 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 v5Z+e4#_K2mMbR}2>r#mV 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 T$bgu52E_jXNXr=0$@~BS=;nae diff --git a/packages/core-cairo/src/erc20.test.ts.md b/packages/core-cairo/src/erc20.test.ts.md index 32abedbb4..cc3f03835 100644 --- a/packages/core-cairo/src/erc20.test.ts.md +++ b/packages/core-cairo/src/erc20.test.ts.md @@ -101,6 +101,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -168,14 +172,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -184,6 +180,18 @@ Generated by [AVA](https://avajs.dev). self.erc20.burn(get_caller_address(), value);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -265,14 +273,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -288,6 +288,18 @@ Generated by [AVA](https://avajs.dev). self.pausable.unpause();␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -388,14 +400,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -411,6 +415,18 @@ Generated by [AVA](https://avajs.dev). self.pausable.unpause();␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -492,14 +508,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -520,6 +528,18 @@ Generated by [AVA](https://avajs.dev). self.erc20.burn(get_caller_address(), value);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -582,6 +602,10 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, 1000000000000000000000);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -649,6 +673,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -716,14 +744,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -733,6 +753,18 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -812,14 +844,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -829,6 +853,18 @@ Generated by [AVA](https://avajs.dev). self.erc20.mint(recipient, amount);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -918,14 +954,6 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -940,6 +968,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1029,14 +1069,6 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(from, recipient, amount);␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -1051,6 +1083,18 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1389,14 +1433,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1437,6 +1473,18 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1570,14 +1618,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1618,5 +1658,17 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index 5724c4fc910a00745d45af65136617d72088c8fa..a34cd8993fd855b73dd03f028db9aa03aab20a4e 100644 GIT binary patch literal 2779 zcmV<13MBPGRzVm^4P^_~P=Z9w+A;Rff6!C!DbSzLb1%IW=(*@02>J(#0=*Q}*N_^HW;`R$ zNb)k)3BITXFM`2~9AQTAKvdDO8P+IAWDiOBUyP$>VSKZD zw7sz=>ftiVcpF9EzjWQpV7Ke>>%Fe$ynC?_VVP;Fr!9~03yku41Md3doZ{4Gv_~0F zlI@DmO9|5ID%!o`)MvzrzCU|S&g>TLp3#ocTU&Y){b+YRC(gTXU)fC51bv<>6Js^O z&r_ovbHeEt{o?kRR9qi9{dowu{I?!j^h4C>xXuChLzAQ9__w4Fl62u&lC+gIQM}@g z7$`b{Xh-SZrG-TneUp6YP~Yy+){gIb!uIKKh%Fr_qAcv9=m(`PmP2^I2L1jStVZ;6 zt`erp;&!@z3}P`P{nqlSg#zkW7%3)OlByv7UWr=1Vl$iD#Ie7nerquqyo+tLxPS8N z#ibWX$?q1DtMXF1C_d?|wwBD=eHAqa81_8$ITP7wGj9X;m!u9wF}O`4WN95g{yR)b;$ zX+Y}-|Ea9?^todtsm`z5&$k(sV7$vTgZDDk=K;@>&$=A;;N79>0o~W>F zp-ryh^kSB5CI2&GLXj_1@!hqMys+f19jRFsONZ}p<1qTxFvWUeT#(=bqik)F?K99~ z5(L!ehRd95BWiI=vQ3s+x^~jfEwwx;*SkD7VNr*mv(RUHiSX!3p(pkupeGflCv9|2 zxnUB=p}s+YvH)cP$^w)HC`;ui%d^+#V*MqY8r&y#)}3Mk@u+XuoOYGz=}NkCTr2y2 zA~Gx8N|S%oL1wXNogZ$H9&ti3S8r_oOiN5+OGFrhOH6Ai0npG5U}#e_G>?RVo}qm} z6oz*6LDLvoK+Vv%`8CF=5imYXKHZYusk2(OdEDJ|wgDqbSgENqxHRz{Q8g`GIi#{u zEHE`=f<4d${h{4xikUT11=E;ghU8Ma)J#o)D??ec*;8lcJ0PpYD7Pihm8HJQ#Hh7x zd8AjDeFExTf9~9$jw0VoMu~M(b(A6^$%P#8j9RWwjnL~5PFo6%>zg58K=v_0%;C2c z5X*PF0~TxN$}w%vj{2}L9qGEENF&|Ooh9f{i-Zn0NT+MF0$~|RhCxl=&JV6( zNlFm^$_1t5OxLy{NsV)#Fm4Dc-Wp_!ZPfFKerAO^wKMC1AEW;QKSn8j z40R03N;p4?tK!!vsmAxn&oRPc%4Ac%=i{wi39Zd}UKNQjU zSBQbHdXO0el+9nL)kjM~K-p*n2q>$4Kv@Afo{t>SVT(1mmDRM3*4K0|2(B-I`1lI( z5v_*ve}MY{_W|w$+y}T%v$)T^-K{`Trim^W{6xQ>|LD&OJ^3S?{{!>{_RyO{PheZR zJVH^7(wOaJ*bUY!*3~=fCvo&l;H#21Z%be(dcRX#2yC_GQkN566$~srP3ddkT@F^P29-F0wMg(R_<^*kYTjSkvRNG}NmU=GN$)m?RiagqU+%(Vk zx!V(03lrQwvH`|liMM)2vE_1c+X*l>{cDfA=RWZ+t}$jVGX>B=^gbCzz-(`Q1LNa^ zy~Fj5eaeX#ER}Q7=b9)X#YV`W;)I1*>Y$LIqCt}(Makf{hN*;5+#3mUt`F03I{|Fe zH3_QPo5>~L=q--8g(_0s3UDt+{F+|hC6nyn=)DC-yc!L365LTTsWOyic}>rZ$lRaU z2fGCBWT`{oAh9_08x}X%4abQcG`iua_`zthS>Zlmfkl0z=W?5!8zHlK&=M_^^x^o* zET)Gj<%a|6Eb3&HL#7?A{;GB)BVF2BLd#!dTOg`op6`ES>}(w#8V6hZyU(Rc${;=J z2e!)!aeC{|M>Vnb;&YZ8b6k>|?X(9pn)5e`=KKX{PSBj7IYD!R<^;_NniDi9Xim_a zpg9p}&L(Qk6z8kmqvO3-2OvPz)KlIW`l+Honah?XKuz3FTT!Avt!muQYz5`46<)&? z8|a{6I;a*J<=*lCd(E|{Wx12HSs%Kl?-0tKhrO-+Kxtt^;Q+Mz6tH?Zsu>JJMb4W96G8395CJ{Jj?_^FD&U4g#sB z2S{#=aeyQohF`J6@IeI6R0Jb<>Hs`-;5JVk7^hMVIpC%49-)!jmYI8~*Y^&gLdVcY z|56-7fBy&^Lydj24}&&QU%0(}z}!(3r!5 z?t@28mvt`3kAhx>DfStA}GR*ItN6xJ^95Q@t~^@Wkqm|D*Ut zzyEj!CsrSBogNn-JT0Z@pI8kCT~F-eo&1Ds@D5kdJDg$Yj`)_YotdBaUA|wrCMSr4 zzq$eb>bp8Ky|`5HU{C46zPsb%!JA!-P?k5ldI#8pXS`aT@hY6d-$eI%R>;Wn|Htt= zj{A&&$g@=RjDUJQL|_76|Bzzt=m7+ZB#4b)rKcCbjtA^`z>Y^r*=BUP4l$Hk^t-{wPmVmI zh)Le%x*v-O00000000B+UE6LWw;A4cQ8a5LK^DzLilzY9xmX#HkH8ivw>b#5n+RPW z;KL$mupQ7Njy>>*Gnk>Yc8t9U@&W~V)yw3neS^M0(HAI+_6gd@D9Aa8oEeQ|S(au- zzb(!dIsEm#b>_I{W$?!zD7U#ouRc5@fo&q{n_C-A#9X%8^Ui(Jq2$b= zcEE@iT(~^=_WMqUaPrl|R}UZj^nrN&=qC>z|9Jo5`Z_v3-1&0#g>6z6(A9Q_GHzQo z^)cFOpDeAfqiwhA5pJJ36uq|j1v>C3`#tqM>evizyNvt9l=A8ixcchMg<);52= zwz0JI(boYd{w1RvV>3$lYN_jX(BAcldr29(SwaY*UOZr9`2?XKs%dA=mE%sADPhDZ1XM(Ml(cYShBacnc%r;JC* zcE$UZ2x)yC?Ot)}Gvdh4AAL>E>;~sISa~Hc+Fj2H^X}PKHWM{LAE(O1SWobq z*l5R`aQexhxHeOY8z9G*hk&bJ=R=Erkc|%O9B{v9a&#PCi~1l+*E@@nHj*ZaSJ)Am zq9cf=O!p=(Oj`6+^r1t2yH6WCzUv9w$HO7CbeM>;UKhy=T3sxM@Ieg*{gbVRyqv0p z>9Vk$t{;L}3@O(dKDAIl9SbAPWGhM)#Mf)G+RKi#rqgwAEAO^}q1N#W)7^0=r`(^8086O?5&C`M2Q zbpGJK6_f`!~-RQ(PyT!sudwN==oMub)Yds5iAdvan>K z9Whm?H=y|JT1Z_oQg?+?VT;8Bb9l2EeQlUxr7$i?aDh>>YN##Gw1or#^||3P=h~2M zX(+8uQY&{w{Jx==r{sE*W*tnL8lClgmQVg4z0`=u=Z}DRl$>}p(K+RYNgRjz1_3ex zWCX|vkP#pwKt@VRM#SI9Am@UR5Kay56FV8-!b~3Z4V%-hHeX*UQ;BOOpHD<)ZJg8S z8~v`cm?S>KP1Pq(Pb^+r&wiC_oN#DJjO?1*Scw3};9nl;1^N8zoliCXwee2f_*X#9 zo^SJOjAJ8Ud>FmEC3(~5ta7uo`)6bsBPv+2sS~(3@jVf-T)62_#!_*-*o+Z&rV9o` zyVe9UX`~L8V~!b8$K2KR&h)l4gfy8w^UQn?RJ0i7w)D8P#8#Uab8S04N}HE`0%Bc# zW;~dVq~|5!cX?B_Od%OxAuT?mmg`fa=XD6D4UNhT%#bc1c`Ff9_)QJO^4)I6V$D=J zrtR6X4-3%4OclMRwCTJJJ&xBpDiEL0ap_sb7!HtcGz>MMCT9=ep7gm67i{G{}ms_kPes z*Pq_ISJ5S>WOUd%J>ESsjt*YzVq{T=Z#~-z?`SF}>nDw6C54z+!)&LApC7e$iZg0y zMAj+jyzsxw>pB?UwB+aQ@UueacXof0sw08E|`?3N<-RHK*8+g>@wkw38Z$88L z_-OkXXvm=&GD+X_sE_fDGDe#E*r=l595$#DSZx$0*jl#20<_Vk;EJ)Az==d4WTz-( zwf<3?kl)`J=Vz#ewAGrH0v%=!khyo4x%&Dw)YP{?l9fV*qiCWH7v;#q`h`SX*uJyZAen%+$W41 zf{Hh?Y_X}^ptw{ON@GHyea6qMF{fr?J@8TtUf`veikCtkgR1b&4#WlZTZ}M~a-)~U zk1?ehkK@;Ptv|q5w3GZl&8hJp*h#L37hpcm`@!yV%|touF2n9J>@HVLD#Pxwk^^>^ zLASx~GVCtTV0U?(I?nsqVmI3H_Gwq>lTOa5^1o=3@Xv6nyzGa&;2_uhWmt8T5**|j zjQ|I^Du0lxfcnlyY~*2!HMo(~w23x1@?LO4tnj$HuTdJ&YKWBstOi&Ouo_@Bz-sEn zYUb@G1@e(1AJJKD!94PJ*dKkT5f2Wra)5Ziu6BKh2W%8ik17WgYa8vh}r(n5!=UG_DIOjcMwpMuF^X-3W#O)t%&)~f0UVHzf_}HeB0?vEZo`)vs zqm!IU@6Y@sC!D*S7a6Yd(MUMT2uBc0Lc8GvVVq#x6NK^+Avi&(LTM{-XrC#cAgqMa zS-2Bw_o#hF*ispB)6_zjp%m)7JWu?*yR3c zEW+2_)mt>lW=HQWFv8U+(@F50$E3PXndNhOW<=(}#GdUEc)p|x$MA^7sb8~Gc-`JO zC-IDKZ`5f#IoYgnpRmB9zR`EN&CZP;vw6@EEmNdTfv7-mN>4XPw6ezwe8`tkOqkVg z2Nu#vb!;U4s%{rXy0o!^RzFF0eDu~n-TTVeX&oLK`>nm*r%EMNkUsST+hv6~{mrMD zCMH6XD?+jv!{sQ-bxlzsP?Vr3K~aLD1Vsso5)>sUN>G%bC_zyoP?Vr37eGK7r&vU-j)2FH5*UyWn^`*BG**6e-xvky032G4x@kw=I< z4xF_Zy#i6oi_2Iz(p~NV>-CWY{oA*%WW(OFC%S}{Ux!uTwLM=mexT*7{WV-FmA;Ml9TV-Fs% z22Uq=I>FNko=%5eJ;`@<7DkHx;Gde;^Y0(bAX4;U>-4xd;Iooq5Gfi0Oi%2=ojfu% z_ {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -186,6 +190,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -260,14 +268,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -276,6 +276,18 @@ Generated by [AVA](https://avajs.dev). self.erc721.update(Zero::zero(), token_id, get_caller_address());␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -363,14 +375,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -386,6 +390,18 @@ Generated by [AVA](https://avajs.dev). self.pausable.unpause();␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -452,14 +468,6 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -484,6 +492,18 @@ Generated by [AVA](https://avajs.dev). self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -571,6 +591,10 @@ Generated by [AVA](https://avajs.dev). contract_state.erc721_enumerable.before_update(to, token_id);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ @@ -677,14 +701,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -700,6 +716,18 @@ Generated by [AVA](https://avajs.dev). self.pausable.unpause();␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -781,14 +809,6 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -813,6 +833,18 @@ Generated by [AVA](https://avajs.dev). self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -879,6 +911,10 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -970,6 +1006,10 @@ Generated by [AVA](https://avajs.dev). self.erc2981.initializer(default_royalty_receiver, 500);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1072,6 +1112,10 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ @@ -1166,6 +1210,10 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ @@ -1272,6 +1320,10 @@ Generated by [AVA](https://avajs.dev). impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ @@ -1560,14 +1612,6 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -1582,6 +1626,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1678,14 +1734,6 @@ Generated by [AVA](https://avajs.dev). contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ }␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -1700,6 +1748,18 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1929,14 +1989,6 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.ownable.assert_only_owner();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ - ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ @@ -1992,5 +2044,17 @@ Generated by [AVA](https://avajs.dev). 'MY_DAPP_VERSION'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.ownable.assert_only_owner();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index 29b46c4bfcdbc30b8923df13a1b6e920f3c6b42a..257ac2f4331f34db30237ba1b516f0c0cdb38f28 100644 GIT binary patch literal 3528 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 C0oQ^6 literal 3515 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 {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -139,6 +131,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -164,9 +168,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::ContractAddress;␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -286,9 +290,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -373,14 +377,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -395,6 +391,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -424,9 +432,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -511,14 +519,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -533,6 +533,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -562,9 +574,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -649,14 +661,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -671,6 +675,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -700,10 +716,10 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 7200; /* 2 hours */␊ - const VOTING_PERIOD: u64 = 31536000; /* 1 year */␊ - const PROPOSAL_THRESHOLD: u256 = 300e18;␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 7200; // 2 hours␊ + const VOTING_PERIOD: u64 = 31536000; // 1 year␊ + const PROPOSAL_THRESHOLD: u256 = 387420489000000000000000000000000000000000000; // pow!(300, 18)␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -787,14 +803,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -809,6 +817,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -838,9 +858,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM: u256 = 200e18;␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM: u256 = 262144000000000000000000000000000000000000; // pow!(200, 18)␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -924,14 +944,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // Locally implemented extensions␊ @@ -956,6 +968,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -985,9 +1009,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 400; /* 40% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 400; // 40%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -1072,14 +1096,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -1094,6 +1110,18 @@ Generated by [AVA](https://avajs.dev). 'v1'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1123,9 +1151,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM_NUMERATOR: u256 = 40; /* 4% */␊ - const VOTING_DELAY: u64 = 86400; /* 1 day */␊ - const VOTING_PERIOD: u64 = 604800; /* 1 week */␊ + const QUORUM_NUMERATOR: u256 = 40; // 4%␊ + const VOTING_DELAY: u64 = 86400; // 1 day␊ + const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -1210,14 +1238,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // SNIP12 Metadata␊ @@ -1232,6 +1252,18 @@ Generated by [AVA](https://avajs.dev). 'v3'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` @@ -1261,9 +1293,9 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM: u256 = 200;␊ - const VOTING_DELAY: u64 = 345600; /* 4 day */␊ - const VOTING_PERIOD: u64 = 2419200; /* 4 week */␊ + const QUORUM: u256 = 200; // pow!(200, 10)␊ + const VOTING_DELAY: u64 = 345600; // 4 day␊ + const VOTING_PERIOD: u64 = 2419200; // 4 week␊ const PROPOSAL_THRESHOLD: u256 = 500;␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ @@ -1347,14 +1379,6 @@ Generated by [AVA](https://avajs.dev). self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ - ␊ - #[abi(embed_v0)]␊ - impl UpgradeableImpl of IUpgradeable {␊ - fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.governor.assert_only_governance();␊ - self.upgradeable.upgrade(new_class_hash);␊ - }␊ - }␊ ␊ //␊ // Locally implemented extensions␊ @@ -1379,5 +1403,17 @@ Generated by [AVA](https://avajs.dev). 'v5'␊ }␊ }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.governor.assert_only_governance();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ }␊ ` diff --git a/packages/core-cairo/src/governor.test.ts.snap b/packages/core-cairo/src/governor.test.ts.snap index 484c0722f939447e383895632f7fc944287b2430..c0e21e9b362a3b9129077f61e899c8ff09bb1c47 100644 GIT binary patch literal 2332 zcmV+%3FG!bRzVxu?WFcr4^jQLRnv{L9xmJuC@WF zKZOLF~0YX6EAtZQv2q99))+9~4)@6vQEv%?rOVdsK z(1={;(pq)yjPIOMroP|}Li_`~hQAc~{3Ca<yR%<=pP4mkJ?8bbp^A1al)neJ0~ zpL#AM8=T3&cBCME9*_;&4LJFwaj&_0uQ50G$dlJ~Pj#UAhIW+w<4=n51ChgmyCpS3jyT^5shKU-<8D;Wf?NagR zZ;~?MawaS*ZpnM2kRg*UJMOpx-=kTAQO*vP(Qz?4WCl2N2Q<1zTfb2!lrColF`jTq z#rGi(!ofGu<42-eF+7lGq}5PDX*NH(~OnC}~Ts(hF`>*|jfe zRzbBZG%VMFvwoNc-HMvtqrL5c@72k~W*G;{yN=6bz=cm$+bv53&XQ$y4mOsuMog-i z3@$>&ph4e`PGope26Sx#{7OMV>K{>iyz3Fi9EmSuGwZSOZ*yHwiI z&^8J&8grg)c(xD^ZE;f12CDU5FQ7tPtj(zk4rfA=?;r0SJl^d-dc3=Juzt9AV3Dx3 zv`ik5c4Lh!ERgo6THz;qhue?7?QU-Etp8|{aJfw$kd@_jBQDw`J^MUgdVlL+dv7x> zzT9Z9WaZB&J=H4gAMEY#b=G&fhYt_7IuG}DHnY|=vPLJ@?cm)^U%{60GN?Y~=FUmcP z%I6ZRD3$W%Cxn6|A}N&1lh&@3s%&n_=afn5E=`N)vgZPpHlyfAtR>dgAXy@L*hMxOXqUFz1t*aSQ|gmgGr8}!DzI8D@_y4U{g*gDv~5JCdGKgG&y?o@S}#q zIF^t>=t$Cuze}Eal5*iuQnZ$(jy~BUvFIu$f$A0FsP$d0@zv|+=H{sr`}2iY({Hue z`}q>2Q*X(P{d|G*^J|rv`ck>HDYba|9gB96_ChuNK2848qk%i5watM0b#0*>Psnj0 z%EAFrUl^UV@7Z$H8e2dJ2ddtT&Mg{9}UUL7UAm;Q+Fxy+TW?YY0xpq8wAbA{qD$|$Neu%3I6 zoERq^ii}YDlV#m}a;z6T7fuYGAC8PP1s5v`b&*bt+5D)Uu}S)ntsm89NaI0V&6T`A z_N{i+`;0JqKx^~l?pLHwJ=t1nX@{fFXNEDRefhJjOw!II+K>j(inTQ0u&LKBJXfuE z=gxET@<3mfBxkOB$k^JzybQ^hUYqnIAdH@Moyah{C$>1TNah*yW9Mh~WLpRt$S!Bz zd3U5vdZ*6nXwypi=bD*StCe23i@5}y!x)_zXLn24`Gb!Pc7FE*urt^h>^xiSTuqi= zf+=4OdB<<;4APIDhd^yVHJgA!ZE8mCIAuud2;|VbF?81oK_?5 zYUGQoGhzQGAPtaq;~)+DH?e;c&Ijk44d*Lt2KH})5J89_MC{*$R6;7Te-rL`v)!{O z1@>>|3xQ8>5uc8oEB0?*djIAb4V?R}Cg2(H40r}S1D*lTfM>un;2H1?cm_NJo&nE* zXTUSy8So5v20R0v3(pnsd}(+-bwVNeK;6#*Z2r!`=CxOa%^Rwb0B3+Rz!~5Sa0WO7 zoB_@NXMi)n8Q@F+&gl_=Gr$?(3~(+B2yj*(fHS}u;C$`i%oA`qxcne#cdgKFlyxN^VUYP45Y8x=k(y3fx( zt}Qkib<$j!2Ur8F0oDL(fHlAxU=6SaSOcs9)&OgOHNYBR4Y0muu$I57@sJF7j}rSx za4(caTc!Uo)cP-|^(?40occPQy0T2eqHlvmXW-jfZZ+HO%V}>b)n0;K(l-;G!OXXW znblo6j28DrM5qn4WE09enOaeKuTf zE8A61q$YgEPutUI7mN+YE@5n;Gqz6yC(`J=Vm~w#dlia33yO`s*Vuav?|$XpUAXr; z*?ir=>ppHQWMlXAtz>QNo_-y$8@s2W>(KSrSl6+8I{Cob&CJ+64SAn6dB^T)u=8uh z&cpO|9|~p2Ai3EE^1N!u^XHIf$TQ>_@(g*#Yo_7OaA&wP+!^i+cZNF?xbt{B;LdR8 z?P(f-)8*rPRyn$=QLqh_zIjT%w2R)Us@qDqR!ja{|X7HaQOVg;!^E~11e zDu`V%S|dhlzUaH>o%7DU=biJu|9;>1{qfVY(G#=sc1HNQ`}m6?l~@?)j0gZwR%T-9 zW2LeYLzLl*e?iFPPc7X8HMPR}Uvp3{q6tiN{|Up+!j8|pvJm4Q{ryj^mZ(EsRG7TDI#XXj%b zIe~V5dUX(~-H7dGG!O|e9eDD~{F`xdyacp`qt)R4uY2|9U$hS@f$w$_xa9^4!;a5! zO<`w<{Te8B-crY>BV>!FrgK(5F1A1$70p6A#3<@z;m$LR0+uIwZnV$EuqFa#mme%; z?xq?H`PmkvXcb}$KTxg4;I40!1ZI+WTzeR>&h7M4-Kx}&T^&mfb}h7o6eMD}vgwYL z^of`Ar*qfi?I7(E`c-;VgD#VJaZ%)X1}*gx4zpSrJ}Q)RL1Z8VHW)D?H;34XfZdn* zWzLT!elImCsB^q6LUXi~bRb5;2V_wJLW-^v@Il9b%^+p40&%w7Qux~H1Gn%80ftj5 zcv_yf_|4Okf}5`6~t(U3`#EC z_7=v7?h4!8^s2+8#gt7tNF)+c|^pU}3I@-I8HxA_B1Yi+R+8sFrDC{KA{4XeyOGO}TwwP-CV>73`a z0;QH@tVZYUV?*@Vt)!C2!&!v_ENQW2=5l6`cFQWPkz}EjWOOhj)gzI{uZ?~_lf&S6|19T9n$E_6=57!>N*@@6C{{|V5VdSzBK zMI@IjjnzK~aJml!NlZ)mqQK|QZ5RPY51ei{g0#xI}$ z-oVyOZydotcvX=}*r;v)+0d$)rJSa5JPG^dyA)KGFMr^sdFTB+_u{PQ!9UMhTT$!% z7rrZ{-#(JJX}-)8A3nO`LtA@JPn(BLLW&*884yjHDM-UC$XS`D4Zhf%>=7O(yYqf)It_HJwv zl$V`FYsgHxQL=CyUyi-5a3HyhV!^V2XAyaL2>+L>-fAtYV^A+|yq|&Y@#fg+% zZ_8Z*un5`#u?ML%*m5s3?&T`&0lff6o_}6-j;jZ4PhGN)xbxRScNWOtZo#rWHFB*@ zASu2xhw`2}6>Q3|k$_~yu|cC{`!byg_3#-*FM+>t?W95QFOvL6pPr2i{vLV%!1)X2 zH!~+i&C~Si14?3Lssj9-qKUwJHmhjqz6|H#|A$==tMxeP3R+VS8X64@iw^nkGuXrG zq9p$Wk(;-tz{P8hYHh}LkVouJ-;(v_>3>#&IImGSi(bfMM{YA zwnT5IIo}J13liNrobFJQPRa1pI?Wdj0$hK>s7f@%<)_@~U0j`>jS>HI8WdSt?ORD& z(a)(!%yZM5q2`gPkKbJ$h;Y$ssLOMCUDq=W9I!w;vhF7e74SFC(iEYCdYnjwf8EbnftES zj}-5MEju1DqH$i798sHH=<*;6(e*6+aFA{TMfYsm9iQa(`3HK^eD1yoR9Wa=xDZ%8G5Fv{Q;h=0Ex{ph2_9Erfq1gE- zwsh5N%Lju1xo$=WfE+{CYeEmaBSN5w4FZsTlc`52f`3+Y{~Iqy=@N?8fF*0cK) { c.addConstant({ name: 'PROPOSAL_THRESHOLD', type: 'u256', - value: getProposalThreshold(allOpts), + ...getProposalThreshold(allOpts), + inlineComment: true, }); if (allOpts.settings) { @@ -335,7 +336,7 @@ function validateDecimals(decimals: number) { } } -function getProposalThreshold({ proposalThreshold, decimals, votes }: Required): string { +function getProposalThreshold({ proposalThreshold, decimals, votes }: Required): {value: string, comment?: string} { if (!/^\d+$/.test(proposalThreshold)) { throw new OptionsError({ proposalThreshold: 'Not a valid number', @@ -343,9 +344,9 @@ function getProposalThreshold({ proposalThreshold, decimals, votes }: Required) { ], true); } -function addQuorumLocalImpl(c: ContractBuilder, quorum: string) { +function addQuorumLocalImpl(c: ContractBuilder, quorum: string, comment: string) { c.addConstant({ name: 'QUORUM', type: 'u256', value: quorum, + comment, + inlineComment: true, }); const quorumTrait = { name: 'GovernorQuorum', diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 255466eaf..496a3a5c8 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -155,7 +155,7 @@ function printConstants(contract: Contract): Lines[] { lines.push(`// ${constant.comment}`); lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); } else if (commented) { - lines.push(`const ${constant.name}: ${constant.type} = ${constant.value}; /* ${constant.comment} */`); + lines.push(`const ${constant.name}: ${constant.type} = ${constant.value}; // ${constant.comment}`); } else { lines.push(`const ${constant.name}: ${constant.type} = ${constant.value};`); } @@ -370,7 +370,8 @@ export function printValue(value: Value): string { if ('lit' in value) { return value.lit; } else if ('note' in value) { - return `${printValue(value.value)} /* ${value.note} */`; + // TODO: add /* ${value.note} */ after lsp is fixed + return `${printValue(value.value)}`; } else { throw Error('Unknown value type'); } diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index 992d4b6a0..30793da20 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -24,6 +24,7 @@ function setUpgradeableBase(c: ContractBuilder, upgradeable: Upgradeable): BaseI const t: BaseImplementedTrait = { name: 'UpgradeableImpl', of: 'IUpgradeable', + section: 'Upgradeable', tags: [ 'abi(embed_v0)' ], From bb44bf7d154304a99b4ad5b3512be7c9adc34c1c Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 13:32:06 +0100 Subject: [PATCH 17/20] fix: controls --- packages/ui/src/cairo/App.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/cairo/App.svelte b/packages/ui/src/cairo/App.svelte index b5e5c0b1a..4c7d037f7 100644 --- a/packages/ui/src/cairo/App.svelte +++ b/packages/ui/src/cairo/App.svelte @@ -170,7 +170,7 @@
- +
From 1cbd91b2118eebe76a2636908cc800305d0d3791 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Wed, 11 Dec 2024 19:00:38 +0100 Subject: [PATCH 18/20] fix: pow usage --- packages/core-cairo/src/account.test.ts.md | 48 ++++++++--------- packages/core-cairo/src/account.test.ts.snap | Bin 1784 -> 1783 bytes packages/core-cairo/src/contract.test.ts.md | 14 ++--- packages/core-cairo/src/contract.test.ts.snap | Bin 720 -> 720 bytes packages/core-cairo/src/custom.test.ts.md | 16 +++--- packages/core-cairo/src/custom.test.ts.snap | Bin 1352 -> 1351 bytes packages/core-cairo/src/erc1155.test.ts.md | 30 +++++------ packages/core-cairo/src/erc1155.test.ts.snap | Bin 3417 -> 3417 bytes packages/core-cairo/src/erc20.test.ts.md | 32 +++++------ packages/core-cairo/src/erc20.test.ts.snap | Bin 2779 -> 2779 bytes packages/core-cairo/src/erc721.test.ts.md | 38 ++++++------- packages/core-cairo/src/erc721.test.ts.snap | Bin 3528 -> 3527 bytes packages/core-cairo/src/governor.test.ts.md | 26 ++++----- packages/core-cairo/src/governor.test.ts.snap | Bin 2332 -> 2322 bytes packages/core-cairo/src/governor.ts | 16 ++++-- packages/core-cairo/src/utils/version.ts | 8 +-- packages/core-cairo/test_project/Scarb.lock | 50 +++++++++--------- packages/core-cairo/test_project/Scarb.toml | 8 +-- 18 files changed, 146 insertions(+), 140 deletions(-) diff --git a/packages/core-cairo/src/account.test.ts.md b/packages/core-cairo/src/account.test.ts.md index 9240e2b90..3896b7e26 100644 --- a/packages/core-cairo/src/account.test.ts.md +++ b/packages/core-cairo/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 for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -76,7 +76,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -122,7 +122,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -189,7 +189,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -235,7 +235,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -306,7 +306,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -356,7 +356,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -429,7 +429,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -502,7 +502,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -577,7 +577,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -652,7 +652,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -729,7 +729,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -806,7 +806,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -874,7 +874,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -921,7 +921,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -989,7 +989,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1036,7 +1036,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1108,7 +1108,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1159,7 +1159,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1233,7 +1233,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1307,7 +1307,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1383,7 +1383,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1459,7 +1459,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ @@ -1537,7 +1537,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ diff --git a/packages/core-cairo/src/account.test.ts.snap b/packages/core-cairo/src/account.test.ts.snap index 8b076020bae420911fe82c4604912d094f4325ac..a013fa64f04464e7787db06f8f16d27c94eee0c3 100644 GIT binary patch delta 1703 zcmV;Y23Yy{4fhRyK~_N^Q*L2!b7*gLAa*kf0|1xi2KN9_?aizSyueYZMk#ky+Z`zK zUrpL>)G=v>)F-rII-_Yfka11Lwo!K6!a8S)HG0kf+(&;qM$~$_s5Jq-p!pZ z=Uw~jD!V)LX6I$*z0Y@TKR>jZj%%I<-@oz$6Six$vne0%Ey7 zsZ-l`$(NhetSc*aa-iDzdJf64@!g((hV4KJ;v{c z0~kiw-Y~+3gWGXA<6>t@2b&Au4LoKF+vSE4_~y2MVI1GCZ)f%lT^9^(FyEpkGmL{f zi9@qHN{uzcCGMy@GzdPTL3^h(ylO^`*UBChZG()@wn75o`t%+%l7BfnV_d{d_XkJo zJ9=}<{3Tlh@5F`%jZ&@XW+xewmR@XA>JphA+OE~eeoru;Q)hU5<1TI5W!7o3R^x1Q z{bYE5((ZUpG`+*Y`aT$(xH;jRcyYvy-j5dMv7mx|kPLdjr9ox;(S@l)$PFgU$JV6z zj#<<>FT-l+nb5%_p9I41nt~jU&V}11Y}ajuP0O(h2d`)gX(kn#sa(R!a3iS;>9P7t zt3$t%#;jdL(;u#+lklL$eEW=*_k7o@Nc(Ajw6;c#81Ht-@Py(W%b_B<8+p^{95cL7 znc6+xDia>b=s3O~rny2g6Fb6m`RKpz`XhrDC(^mH&nyx!$1;erkSfIMHXYk+oU*<_ zEar%7;lYU`DxQO;qw4J1zm#<`OX?c?jj$Mn$VRmd} zA4qp<@n{)MpDbtR4Ra7)8*Li24HAc1dCC*hra{1b(QvubZwxM!!x<}$r6nBwT~>#a zdR>GbyC_AOdm}w_bC++VX76jBlD+A*13A>wAhA>a^j2skv?IMjQ6{Jo`0K>8z` z-xV_Y6=Vc50vQ$YeI`5}0uOm}i;30{J(w-Ep-c)#~x(Xfw4}pgY$U}Gv1?mEI zfx19lv-rx$gB5B{T&*q=ozJjg`55g+WwGtcC!xQ~Qa z`=T9ZkohJ$jiV%Xl6)GoQ_^Ez*)Ex(T=hxgDS4eeN$sbk_gEs=j#XSbkhi9OZVL+u zW4mdJd*&7uNRewFqBRk|hUoSvXEoSZp&kU)c1tC%D1|bKBlA(g-`F3N>lCUri?EXAQT`J zAQa&272w(=%ztDT*8f%kny-pfSU-3H{j+GMohFgxJX3tFxSzIxPbQb9jo5-%()E%aZ{EiSzDJX_k>Aje00pRIpl zn~Vo+{h-NzxUemo`35;W__VaKL27Q>qrz@DjGWt|MQ(YFf5AMDIW{LXmkXboA|RIQ zlNz;sm)zT|-gvLNSt?z>8wl#3awZJJ3>%ii8(uppwcRE;?ClPZ$-@#MgmeN%T#xYw z;Q)pawl|EhVgGhq&bZi_(81=ycLR@^!gje~1ira{Z5YS5YulMUL)QfZ8_c(;$qeJ* zPU6t)j#6XIaEUu=4h@2jXwcdz4X&C|joyzI=CPoHeUJ=#z@4=z`A11j%G7~$(boubV@A^Z77AMlVvd=6MFvl{8vXCmo>ogqOte>); zK`iEot?jKf$v6Ez)o_tiZEg#jI`#wRmy>>BM7W6dQM8?;o0qR-Y-xFu^p9PO$YFLU zWFJU(YVl|pO`a@g=XJ9mUh6FyvwAhA>a^j2skv;IMjW8^u47@K>8z`-xMm}i;30{J(w-Ep+*Ej|x&j^o4}pgY$U}Gv1?mEIfx19l)A-8B_>;^89DfSz zRZ$A2GSS+N((>gB5B{x?*dIkIJjg_=9v|$-GtcC!xQ~Qa`=S+Rkl7|WjiV%Xl6)Go zQ_^Er*)Ex(T=hxgDS4eeP3@BfDvWduA3D6Y(Z>gi>({k-~hD+wFR|Rg#0%v87rTuCJCBv3=7f9!7{zN{kKYh z{JKbAZp&kU)c1tC%D1|bKBlA(h0pGjN)zqpri?EXAQT`JAQa&A72xVP%ztDT*8fHU znlFn~SU- Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -44,7 +44,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -64,7 +64,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -89,7 +89,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -114,7 +114,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -154,7 +154,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ diff --git a/packages/core-cairo/src/contract.test.ts.snap b/packages/core-cairo/src/contract.test.ts.snap index 4be8de0cd657ecb7149098d6c7711c3b608ed532..f18abae37cf688fe8e500e2154a60e171287084e 100644 GIT binary patch literal 720 zcmV;>0x$hRRzV)Hsgq4RK^_U+&lN&gl7+@BNoj>q{}U2Afgzr zO#Hg}pf>XT<}Df7K`R56aH*?9`vxUgOk^2sIkPc*sU5K5$VHDnCPWs2I~$ z8B}SO!1fuV(INqo)92lMV}<3leROa9)1KSx^r{O`*^^%-!4qAs)2tj|R=tg1t2g73 zs~_Hlnm0vFsH>^8VkHvw0S#orh;)v2%Xezp{aE_%+Knw1BL_hy_&5j#M0r8dsCl#0 zESjtz`vnH7n00X42Ox>o0Z&nL0ol%Pq@)CKsHWvHEg;+TS_Y4mS=Rbmj~a1v6#c_Vv0g3f?Aeh|#E1^tTLU zIlmJPOGZl&>TwE1pw@>>1YcI4s4&|?5u9n@Z~VM4ksV3YsaU~ZExhn#bQ%!4 literal 720 zcmV;>0x$hRRzVZ6M*hG+%3!X)?hqmjxO` zrtL%wKOc(-00000000B+RnJeszbag~6-M-IZ;XpmDg;PtmZF z3T*^0`a40l3mcT>f>o>$-YGtUmpPg@nCGaKfel~Kfg}qXLRo^htDUtcoz);%+H)-I zu|bZaQD^%>Mk(}&;9~#)P+-W4L){F? zw2C^+R6?4}jNw0Lc(KW_^w5gl7$w#0+a1eSQyjAx(}S^SrQ$uJesO=+C{s38 z#Gf`kozE}Q_f0MRIFk=f%~*dqJ?-xtY>ykp9y)ObiK2ZH>7CQ35J`N z@`B%yh83d~2+c5qGSKKlYQY!PM=DIVPzEO&_!~bj)UqRqIyEbVi=`LV7N`8o9ySf+ zSeR63GFa$GmZ$g!8va?BzefJiDz?JDkD>u(xLqyQXC9k*?B9E==B=MzME Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -85,7 +85,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -171,7 +171,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -232,7 +232,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -247,7 +247,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -308,7 +308,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ @@ -385,7 +385,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ diff --git a/packages/core-cairo/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index 4e9ad5ff9ed49816839fe396c330a2728ead7b72..fb2302b7eeddbd77ce0c80d27359a3cdb8356a92 100644 GIT binary patch literal 1351 zcmV-N1-SY_RzV+%8M;$_Wh<;vKUR_yUX*Axv7n1OE1`=ae8J;xyp@(*^wIjM|AcRnC z8gg<5CrMLCK5!*ENS`U2VPn`(cteHP1D^~6DGET3=YO}5{xUx;NCyH?7y zOm(;jzb3w>wvl^K1bGjt${ zgl|WkcA3#>65jxRiO)z;BIq?{%r{2B*rjnWZqPqY;kslE7Gn zYuzK7ULz%7tSCc0{GDBxcUl{%5wJlYB@Zlgen8}C6!|i(0+zgN zRfaK3vkZ~pp5bvrmQF&*(?C8$#PjG*HHF%PPUklu=1Z zKtBL)Ca!8J4s|i>nl_M|Z|+!EX5Gi_&`0LRl`BSLkUrBDRSlKFrQ^o?mD3}lhf%h7 znP>}$i4ef06SCmiNf0*`WXswpXZ^cr_h)zw^SsrI$Uu}b^YOyJ7GeFpFoT38z#VWZ zuQAqnz<5vndg*Lez+rHbMw^k6Hl7g4O^}Ws$e$XhqM$;OM)P0EXwOH^+0bkrEdlX_ zv^*K-y-8__q1%VCvo%$q-q;1?v!tRcrN$WagkCYrX-AfLxX<_o?8!!`yDAYl zwI+PLCOp6Gz@|ROcz$J9pJUYL81*?ueU4FcR>oPE>0XZ#jtB$f(L^G6GyB2eA_rI{ zyXNaDhF&;C)wEFK}$Cjd2HKZ>tqj=p#pK*>k*g_cELUrqKKL{dKJXz%;| zjm@onXMcBl3nL!_xw^KB-o~&YF0EJ1*OtxecsCsj@umM&PB6aNNZOsWZS3`%Ti*bflQ9gd7>>riA_7;^F#h1d-8GC4_B(4Yhg38BK?EFQEB95DTa~$tC9PCv zJZZVzO2SqOjks}wvv9G|^ijD5(j@fqq+wj{@BnhR0^|s}s?(QC^!6&Q1o!~bPgbp6 zaxYjk6c<@_lI{=?*#awM=NXkp)=3pFX9nuFm_xiiWd%vn%Fka>wWKBm?P67+rC{`K zQDN$wal)h%vvIRXGA(<+2EX4C%G$D98Jw9_Qg$XxJylG{__fv5*ZK=dDuC{LG;%!u zpQX0`nZ=`m2j2J?4KcU!Uc#-52kL_QYQ&VD^gs0_hS|AxFm0y=^?iXUy)Q6q{0}lJ Jp$Eb+003ptgXRDL literal 1352 zcmV-O1-JS^RzVK}^;00000000B+TFY+ZHWW=;G)27Y2NdAUpnwB7aXLU2WjX}{Cv6QRO^^pL z=^zzo=_)27QvylnF@Xzo*G)fS`UU-ieoOaVbl*)OiIhn_@w*v%hvzJwG>muBAMtQP228G1II5Wz7*i&J`@{u|yNBcXzuD0+F6nLz>Z%hEA$}mD z-^wzv?s*)97_BuD2Uq*QXhuZ#F)EAQLTa8dGU~L2;0&0wTsGq;i)-bf^BFS2sw`$9 zm8lMw#A~b63O9EpR zu62uOdX1ETv7(Ih@RKSyRt*n0J%i>352Kb*+-Ys3M!<#xlsvG|`2msRQRK_C3Rv>8 zRT;)C%`!xWdxpmiSvmT-*B(LfoyEvp1CQ${5v z0eug=nYgN@IMT(eYuZ3=zPVvtnROqxLm!zNSFRY1LHbNrR5erv=Z+iiS5BXZK1SKz zWuh%0CPDz0PRN2wCqdj)kS%MYob~Uf-Jjt#%JWt~B12Ki%ts6VT7>oY!VD6Y0C&i# zyu?`N0pnfu>$$UC0f)g!8f`{O+IT`FH$ghSBY$e3ih>GB8qa?vqdgrtXG61jv;@Q> z((+`a!vm3hwyevNGy$4_Sm`lY(O|9l(gZ!6TqtwDhiI8L)$!`x2{7P9f+IPh*%ZYa zLaI!z zPOS;=uL)1DJFuzGF`i!8)#n)XIYxbsQJ-VfoRx9bdAir5gd@TLc{Gs--pqb*ILiT6 z$*%c&3i)~#&P^uG*Ry{VF^fkC^$9@D*Z1OUnWHZr22k?Re4%BL*B6uh29cBxI^6w! zZ+&BP&)M7A+Qi6*K)zmmjo!qtAug>K&6k$V%Xl|^5aLV!tDInbwVt#)Y1`QAH#Wap zKioQS);G4hKPF=sRWTfmeMJPWq+$HQgS)F3@9%Y1pAV^K_QMD`##ZjDD7Pwe8B1EJ z&Un&tyOxBl6dG~k1ZUx5qv@k^3#3Wt zyX2m+XechS>LlGDAhHEk$j%cgkF1j_Ud{~EZ83*<1Ih}Lq?Mn)qH0M^3fjf0Kuf{s z-J-(OIpKs!CuZYjkz`u-fDL}XA(XXcw=y_0tEB8qn0l(1j)&J)7hmcxB&h(p?a|25 z{C}3(`ezo83hsF0V?4y%%6ksCF7Buc>Z=h`deZ;cml$T}+QGD)7S#6zru4qRsPR8# K(gsq(FaQ8uCyc!S diff --git a/packages/core-cairo/src/erc1155.test.ts.md b/packages/core-cairo/src/erc1155.test.ts.md index ae5b7a497..518920287 100644 --- a/packages/core-cairo/src/erc1155.test.ts.md +++ b/packages/core-cairo/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 for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -81,7 +81,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -173,7 +173,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -280,7 +280,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -357,7 +357,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -482,7 +482,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -608,7 +608,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -735,7 +735,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ @@ -880,7 +880,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -972,7 +972,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1082,7 +1082,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -1206,7 +1206,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1320,7 +1320,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -1448,7 +1448,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ @@ -1657,7 +1657,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ diff --git a/packages/core-cairo/src/erc1155.test.ts.snap b/packages/core-cairo/src/erc1155.test.ts.snap index 6a21be873c8aebf4c7f3aebd0097f0ec9833387f..ee615fb389db7c1778b57cf1ffced23782e6329d 100644 GIT binary patch delta 3208 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 delta 3208 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 diff --git a/packages/core-cairo/src/erc20.test.ts.md b/packages/core-cairo/src/erc20.test.ts.md index cc3f03835..4f2d5b916 100644 --- a/packages/core-cairo/src/erc20.test.ts.md +++ b/packages/core-cairo/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 for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -49,7 +49,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -120,7 +120,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -200,7 +200,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -308,7 +308,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -435,7 +435,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -548,7 +548,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -621,7 +621,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -692,7 +692,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -773,7 +773,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -873,7 +873,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -988,7 +988,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1103,7 +1103,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1187,7 +1187,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1330,7 +1330,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1493,7 +1493,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index a34cd8993fd855b73dd03f028db9aa03aab20a4e..42e963093102131a963546147234838e409def3e 100644 GIT binary patch delta 2520 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 delta 2520 zcmV;}2`Bd3726emK~_N^Q*L2!b7*gLAa*kf0|3TpnRrDC^ZdZ4V7jBhN_kJD2$)ACfOA@_AnBrM|Py9M`-I{_rQtZSK&kPtQnTn~3`6##$ROmo10h zxlcNjoH^7E81aG&mj}Q9uG1l$eDm z@1ozWt*n2xvbM1B>~+A2f5|Av*h~_>S?IbQw10i#UQ&i`77#)x3@CCv%DzodG3Mf5 zjH6~@e6xGBy|E_h;WEm28%5v0bluBfx9joiy{_kfynC?_VVP;Fr!9~03yku41Md3d zoZ{4Gv_~0FlI@DmO9|5ID%!o`)MvzrzCU|S&g>TLp3#ocTU&Y){b+YRC(gTXU)fC5 z1bv<>6Js^O&r_ovbHeEt{o?kRR9qi9{dowu{I?!j^h4C>xXuChLzAQ9__w4Fl62u& zlC+h7HBr3cjumR%sf7aSSQsfLTav0E{$7b%zG5?*+r+WIrG9HM z8N7>aw77rr>&2xPNy+aPlB@Dkx+n*)!S_OcG(7VN}XG@ zK)OmwaMGNffl65lq4T{a!6rSMK_*G(Gz%7^Cv}tY^DWCp=v-#n3`y#k9G?{vQ3s+x^~jfEwwx;*SkD7VNr*mv(RUHiSX!3 zp(pkupeGflCv9|2xnUB=p}s+YvH)cP$^w)HC`;ui%d^+#V*MqY8r&y#)}3Mk@u+Xu zoOYGz=}NkCTr2y2A~Gx8N|S%oL1wXNogZ$H9&ti3S8r_oOiN5+OGFrhOH6BjDFM*X z4Pa zGq^PI9Z@wcTsfq&QYB|#iYiED&AgaJn7rZU<1|BuJ?F#AWo0}LP zA8l`f${eaPv-F`yeT;9UG16AYMja*TutAlrrQ}T4wjoK4bDuD7 z2rAwhWQ%Rp2F0byPzn=@?K6I6g*mk|>wzDm{{lZoDSixf49ZG4KZ>j3*C?sR_kYOG zF~VZXWK+K9`;$WN4SHzcH8D|vTN?su23)?O$_`$6w&xsh=H$qkQoG&&0nb1M@vCK z*=Pg^D64%ySphkoj~vlqi#52F)qk{&*4K0|2(B-I`1lI(5v_*ve}MY{_W|w$+y}T% zv$)T^-K{`Trim^W{6xQ>|LD&OJ^3S?{{!>{_RyO{PheZRJVH^7(wOaJ*bUY!*3~=f zCvo&l;H#21Z%be(dcRX#2yC_GQkN5R zs5YLdX6cjIQ>pi79(xLrqVuB5bq?l);7bUatOzlOn8!51xG|5>4M`C5C_^bLaBQEF zV;-BOg+>HsN#+D?bX()yaa7x7ES7pM*U6*DJBmEoeB3n8_qp2>R|^x|Ke7SFUx~MR zMzQ5`aoY(nHvMalyXQXfE*Y*dW-c=Y&_VP*8AiZtZ+!#fIY2$1(P@k zG7RB9VSz<`qvvv)og0&O2qS+&%U@($AgW=W?|)>MbCw%(T#}mYv% zKl?-0tKhrO-+Kxtt^;Q+Mz6tH?Zsu>JJMb4W96G8395CJ{Jj?_^FD&U4g#sB2S{#= zaeyQohF`J6@IeI6R0Mw`cKEn9T=xl4LRVY?jE6$+m@MosMq%np+d*dNB>eB zLx2AW97BzL`d$V7Q1B4Idby;uKn*-52E1M1?W&Zw3+ZkuYR*wT_tS?~jL?|Fg6@My zPM38q$B%+z4;*{o*aOENIQGD?H@Z^b*sF(QFV|j(N4QNq!c$PaGqmu;>W}}U_(i|} zcm^j{A8wr<7au$=rRbkn4F_FM?BkvMglzB*SI|40Vd#$dmad(dpZ8t9U%4hHh=aen z0siW{Iy1evRPbO=>A}8}W(qbx?&tvoiX@1QU!|uPz>Wv(c)*TFU3NT1JYYhaYpSvX iQc{g!N2CVNZ-E^Wc{-`V4#}LJSMz`FWK6c`(EtF=!tILy diff --git a/packages/core-cairo/src/erc721.test.ts.md b/packages/core-cairo/src/erc721.test.ts.md index 0296baa5f..2006fd867 100644 --- a/packages/core-cairo/src/erc721.test.ts.md +++ b/packages/core-cairo/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 for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -55,7 +55,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -132,7 +132,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -209,7 +209,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -296,7 +296,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -410,7 +410,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -512,7 +512,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -611,7 +611,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -736,7 +736,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ @@ -853,7 +853,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -930,7 +930,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1025,7 +1025,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ @@ -1131,7 +1131,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1230,7 +1230,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ @@ -1340,7 +1340,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1524,7 +1524,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1646,7 +1646,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1768,7 +1768,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -1860,7 +1860,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index 257ac2f4331f34db30237ba1b516f0c0cdb38f28..cb80f55cb5984868b69be2fd2543c7c18ee4fcf9 100644 GIT binary patch literal 3527 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 B-K+or literal 3528 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 C0oQ^6 diff --git a/packages/core-cairo/src/governor.test.ts.md b/packages/core-cairo/src/governor.test.ts.md index 20ef39665..3c8e8a77d 100644 --- a/packages/core-cairo/src/governor.test.ts.md +++ b/packages/core-cairo/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 for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -151,7 +151,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -269,7 +269,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -411,7 +411,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -553,7 +553,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod CustomGovernor {␊ @@ -695,7 +695,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -719,7 +719,7 @@ Generated by [AVA](https://avajs.dev). const QUORUM_NUMERATOR: u256 = 40; // 4%␊ const VOTING_DELAY: u64 = 7200; // 2 hours␊ const VOTING_PERIOD: u64 = 31536000; // 1 year␊ - const PROPOSAL_THRESHOLD: u256 = 387420489000000000000000000000000000000000000; // pow!(300, 18)␊ + const PROPOSAL_THRESHOLD: u256 = 300000000000000000000; // 300 * pow!(10, 18)␊ ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -837,7 +837,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -858,7 +858,7 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM: u256 = 262144000000000000000000000000000000000000; // pow!(200, 18)␊ + const QUORUM: u256 = 200000000000000000000; // 200 * pow!(10, 18)␊ const VOTING_DELAY: u64 = 86400; // 1 day␊ const VOTING_PERIOD: u64 = 604800; // 1 week␊ const PROPOSAL_THRESHOLD: u256 = 0;␊ @@ -988,7 +988,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -1130,7 +1130,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -1272,7 +1272,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.19.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.20.0␊ ␊ #[starknet::contract]␊ mod MyGovernor {␊ @@ -1293,7 +1293,7 @@ Generated by [AVA](https://avajs.dev). use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ - const QUORUM: u256 = 200; // pow!(200, 10)␊ + const QUORUM: u256 = 200;␊ const VOTING_DELAY: u64 = 345600; // 4 day␊ const VOTING_PERIOD: u64 = 2419200; // 4 week␊ const PROPOSAL_THRESHOLD: u256 = 500;␊ diff --git a/packages/core-cairo/src/governor.test.ts.snap b/packages/core-cairo/src/governor.test.ts.snap index c0e21e9b362a3b9129077f61e899c8ff09bb1c47..cbf65b0b991efd13c0d88ddfb25c4df51daf566f 100644 GIT binary patch delta 2290 zcmVsK~_N^Q*L2!b7*gLAa*kf0|1i;C(S@C#9ou%nIllKdkH-4ruy zweeubuH_W#icC0DCz~*J$MKGG+`upPYQX-B?k^p9{GmI4k)r50ab)MKSBZG{JV)|$ zcl_kQ{5m}Gg?ldl`#+{U|5j z`2B=>^P^o0Oc;r{wzYrd9%ZYH1gH9;6v}UNwP3; zBL!z%U2R?~9(%1Am!9C#agvt&aS}4(%HyX!Zxr}{EKe}W*<&g`E+>cV0LR{l#rLTD znz@nk1TTs4qfku#5Q#7veHULIvy_f@gY%i$PRH5hDz5AwhtyMq%ECEW1#aGi*_WcC zErm+&xKUNtzM@$r)o#$RLI=+KVHUI-H+{ecyQ9Ewl9|o24pes?kE>9~fa$h7jtt#( z$LSq^ZLjBzm{l_!T%?Y{!Xb@MX7}Y}$eCZ!C_F!%@_gwyZg?3eaT?O#?9y>0_kwoE zae6Oy58Iu6rf590O+rk@oHyG(mGU{2XU%+|+8PW(Cgs)UlCIziE*1IV<-yU*{r-!W z``x3h*j;)GC=M5cubd9vEIQdP|@#hfZF-Dg?xLiR$y%4U@P zh>gU?8YE9-RLMf?*efffn-9*U5f9YyFt)4@e(^Is@fvJ&!Up|uYx$M_GVTCmY5ak&u&#RB^WuYW?8#ZA!FIC z@VI#^tTVTNj8n~+@oP8dx}-qqd0TmsTXn6wYge70LPvY647$|(1o@Kc+8tzm?BWus zevioKf$Z4KPLZ$Gw?)Wm{x%AIqL8<;A7-nWNnm6A$PT7C$_As!`mHieJcG@DIia{n zn#h_IlNHnK=<&mk9uAXOQiYMLNH6&=edy6*KnR1uo97b!O^o5Lg>o_>CxsY~Mnr#qVRh1>Pt~L~)*7<3f9fO6nE~>pW1(ZtsaUZbtkErN z2A?eX>UPJPfvq)OWjCxDuzcB8ulLPKF}+}$)$NQhd8gBlGVy>X!X)636XUx^o+M;L zBAGvQh&6~#TBQetz7pq*JJSzwlT!H)P&1S8{n)QcOD`L}I!^p3`w>5X^0=ow>U+Pi zu#v8N3x$#~$|`C!uvvJJoEaw@imXuPlV#I>a%`477tRb`9FD9sB^N6Vb(Kww`TVG# zu}SujZ5}mdNb5md&y`|0^{sK$hn#RaVvS|;@LMuuzUr)ZjKlHgOUoFuzWilgCT(XL zZOp=W#abC~+%{{Mo~zM+y9?(zdwF0kOVTqpJ!EQaU|)uGOmEEk5fIKU`fh9({WB`h z9Flv+^3?g+J()_$Le&@CzwA%c$?Vj59b;O_{@k#$8nv5kX9+g{&BEr*4~5O!x|5&=8h_alfHS}u;0$oC3J7r4AAmE!8Q^^D z;4D&b&U$kRI!gylOhloaC(f(w_0^45ZqApChV{&O zwN>)bQC3?m@)Zfh#pjK7t4Z2VmZ8(oY3MX`8afS~hE7ALq0`W5=rnX1It`tMPD7_} zS%0V1zw~%WMqMIG zTcGbIGJ}=x2`lTnavU$_%Sg}|SnYxUe^GW znz}m#!i)QCw6UfwS3i;3(3w14&!b$hHQ2g>t) z#%lQX2lwsLjn(PS>K5MRac3bLyQS|XYh$U z$orznJ9bNhoj)pe9%t|J&?rMj>CG;Y=ckrDe+7AlJVTx#&yZ)lLmKW3cZNH|o#D=K zXSg$gJ5RR*?hJQMKX7NbGu#>O{Jz}zolx^CsQEqoKZVryi3s9ORrbp0W6PJj@a0AD zWr*@^igIm3h8o`oH8$VJv1uGFV_V|Ywe^i`FLNCy?yR++cJd1Kp?JLoD#p7uK3*Kg zyEg6@1LIvAP+6$#;;1Yf77qJC9TxHmdBwXn%zx;{yEfh#KJQ;{1wrRV^t=vweuwn@ Mf2Sa^aoXJg0R0K6r~m)} delta 2300 zcmV(-^+H?Ow%?s?AkFzM;>(rvwd;GrTF9DUeA{Hj~{;X)}43m zM4va_zVrT@_di@%Af5fqAMWnB4rPMg-R@B)-M&i$i|lS6&MhpE4L@aM17xsdM+ayoXNm;q#%7BkPX`nIQgYxdHEy z-ScnxkOqtg42-eF+7lGq}5PDX*NH(~OnC}~Ts z(hF`>*|jfeRzbBZG%VMFvwoNc-HMvtqrL5c@72k~W*G;{yN=6bz=cm$+bv53&XQ$y z4mOs5vPMj*nG7yM#h^joj!tI#@o31IUQsJNJ)LwtVOdUa?n{0g*#616WeMi`&6Z_# z9&PV8Tf0=+(a<&uF&cB8ZFsg24{dQ$&jzaXUN4|RT&&Hh3JzyNlJ6hy9X#IcK6<>n zb+CT8cVLmQwX{qgkalB@EG&@rr&{4BdxzV9kG}10Ztbl9XpwNaO&*Yy<#r=3+9W;u zJYRZ$>tK6tGcCT{Xs=}D&nP|BD(oNZ?eBHgce;lU54JiF_jWe3)-iI6<7kEun{u2v^>7O^fHU=K_{Cqv%Jh zCDzs;St6}U8d}9(SRh;3;7n@KKphQZ^XlLyKifxcjSh}zuRCnaKUH5w9e|7tz|mI^ zD&2U?%2)j|9UVH-mh`K&DY?h**m`e&;Ep$;VA7pf?UL!!TNO_UTF$ar)~uAvSad5~ zrr!$V%*`L;STiR4+V#0EE>L*hMxOXqUFz1t*aSQ|gmgGr8}!DzI8D@_y4U{g+iC@PX9 zGA6}%#WXp3^zfsG!#I|ZLFh=*iN8ypdXjSCQBt&)rH($?BC+TyCV}b|;;8jquJP6D z=jP_A6Z`XpSJQ8`+57ntq*HInjQxCp^Yd$!nfg+>v?;ZC`W=gQk@iA0{XR|p(xZVp zq_xd}`*m%h98bt`A{QiDQQ@>9yJ@rSrksq6=+n2CE{ zN&1kjAJt|^<3U`_mApUpt#;M>j4*pZYxCspSENrp*;;C8hojGDhB2mn`LnD{(#|B> zkOt9;wKU+csn;$%SFLw{=gxET@<3mfBxkOB$k^JzybQ^hUYqnIAdH@Moyah{C$>1T zNah*yW9Mh~WLpRt$S!Bzd3U5vdZ*6nXwypi=bD*StCe23i@5}y!x)_zXLn24`Gb!P zc7FE*urt^h>^xiSTuqi=f+=4OdB<<;4AQK6)Fl9onaM)W5O}3 zJ0<`U0C{r&GIO*c4V+dZ?rP+VtTSQ%CLj%vcHqxcne#cdgKFly zxN^VUYP45Y8x=k(y3fx(t}Qkib<$j!2Ur8F0oDL(fHlAxU=6SaSOcs9)&OgOHNYBR ze+{s{X0VpOs_~Evc#jhMNN_KdMO&r+G1U4msP!zUHJti7ow~A2!=i74MQ7mKT5dJl z?aOIzE7e|tUD7ubox#kvgqhV{IgA$fMMS6#v}Qqo@{EG=MD2y|!gt}j*Y3LzU5M^0 z63$vh&=l4(6Iq-3BJH)9&C#U118 zf`Hi{Rqe4@b=4hw?nZq!Ty87dRZpZQe8x}P(`Xlr4aP2EY@su@PXi~?=)7V-G!%Ok ziaiU8jlI{{dkyb?<=$Pm_d3~p-N5TUZY*SD_w=n~ZS0?P(f Date: Wed, 11 Dec 2024 21:23:33 +0100 Subject: [PATCH 19/20] feat: update CHANGELOG --- packages/core-cairo/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core-cairo/CHANGELOG.md b/packages/core-cairo/CHANGELOG.md index 55228c657..5690a8384 100644 --- a/packages/core-cairo/CHANGELOG.md +++ b/packages/core-cairo/CHANGELOG.md @@ -2,6 +2,8 @@ ## 0.20.0 (2024-12-10) +- Add Governor tab. ([#417](https://github.com/OpenZeppelin/contracts-wizard/pull/417)) + - **Breaking changes**: - Use OpenZeppelin Contracts for Cairo v0.20.0. ([#419](https://github.com/OpenZeppelin/contracts-wizard/pull/419)) From e1941b3421fb63c1478b4afce24e728832852d61 Mon Sep 17 00:00:00 2001 From: Eric Nordelo Date: Thu, 12 Dec 2024 14:40:43 +0100 Subject: [PATCH 20/20] feat: check quorum and proposalThreshold --- packages/core-cairo/src/governor.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core-cairo/src/governor.ts b/packages/core-cairo/src/governor.ts index e7ce51e09..5ff6fb99c 100644 --- a/packages/core-cairo/src/governor.ts +++ b/packages/core-cairo/src/governor.ts @@ -8,6 +8,7 @@ import { setUpgradeableGovernor } from "./set-upgradeable"; import { defineComponents } from './utils/define-components'; import { durationToTimestamp } from './utils/duration'; import { addSNIP12Metadata, addSRC5Component } from './common-components'; +import { toUint } from './utils/convert-strings'; export const clockModeOptions = ['timestamp'] as const; export const clockModeDefault = 'timestamp' as const; export type ClockMode = typeof clockModeOptions[number]; @@ -347,6 +348,7 @@ function getProposalThreshold({ proposalThreshold, decimals, votes }: Required