diff --git a/.changeset/mean-shoes-cheer.md b/.changeset/mean-shoes-cheer.md new file mode 100644 index 000000000..6fa347a1d --- /dev/null +++ b/.changeset/mean-shoes-cheer.md @@ -0,0 +1,5 @@ +--- +'@openzeppelin/wizard-common': patch +--- + +Add macros descriptions for Cairo diff --git a/.github/workflows/compile-cairo-alpha-project.yml b/.github/workflows/compile-cairo-alpha-project.yml index d14a6f840..280f5bbe6 100644 --- a/.github/workflows/compile-cairo-alpha-project.yml +++ b/.github/workflows/compile-cairo-alpha-project.yml @@ -47,17 +47,32 @@ jobs: set -e declare -a all_kinds=("ERC20" "ERC721" "ERC1155" "Account" "Multisig" "Governor" "Vesting" "Custom") + declare -a all_macros_options=("none" "with_components") declare -a all_access_options=("disabled" "ownable" "roles" "roles-dar-default" "roles-dar-custom") declare -a all_royalty_options=("disabled" "enabled-default" "enabled-custom") - for kind in "${all_kinds[@]}"; do - scarb clean - if [[ "$kind" == "ERC721" || "$kind" == "ERC1155" ]]; then - for access_option in "${all_access_options[@]}"; do - for royalty_option in "${all_royalty_options[@]}"; do - proj_name="'$kind, access: $access_option, royalty: $royalty_option' test project" + for macros_option in "${all_macros_options[@]}"; do + for kind in "${all_kinds[@]}"; do + if [[ "$kind" == "ERC721" || "$kind" == "ERC1155" ]]; then + for access_option in "${all_access_options[@]}"; do + for royalty_option in "${all_royalty_options[@]}"; do + proj_name="'$kind, macros: $macros_option, access: $access_option, royalty: $royalty_option' test project" + echo "Generating $proj_name..." + yarn run update_scarb_project --kind=$kind --macros=$macros_option --access=$access_option --royalty=$royalty_option + + echo "Compiling $proj_name..." + scarb build + + echo "✅ Compiled $proj_name!" + echo "---------------------------------" + done + done + + elif [[ "$kind" == "ERC20" || "$kind" == "Custom" ]]; then + for access_option in "${all_access_options[@]}"; do + proj_name="'$kind, access: $access_option' test project" echo "Generating $proj_name..." - yarn run update_scarb_project --kind=$kind --access=$access_option --royalty=$royalty_option + yarn run update_scarb_project --kind=$kind --access=$access_option echo "Compiling $proj_name..." scarb build @@ -65,32 +80,19 @@ jobs: echo "✅ Compiled $proj_name!" echo "---------------------------------" done - done - elif [[ "$kind" == "ERC20" || "$kind" == "Custom" ]]; then - for access_option in "${all_access_options[@]}"; do - proj_name="'$kind, access: $access_option' test project" + else + proj_name="'$kind' test project" + echo "Generating $proj_name..." - yarn run update_scarb_project --kind=$kind --access=$access_option + yarn run update_scarb_project --kind=$kind echo "Compiling $proj_name..." scarb build echo "✅ Compiled $proj_name!" echo "---------------------------------" - done - - else - proj_name="'$kind' test project" - - echo "Generating $proj_name..." - yarn run update_scarb_project --kind=$kind - - echo "Compiling $proj_name..." - scarb build - - echo "✅ Compiled $proj_name!" - echo "---------------------------------" - fi + fi + done done diff --git a/packages/common/src/ai/descriptions/cairo.ts b/packages/common/src/ai/descriptions/cairo.ts index 7d9e03485..205d83723 100644 --- a/packages/common/src/ai/descriptions/cairo.ts +++ b/packages/common/src/ai/descriptions/cairo.ts @@ -27,6 +27,11 @@ export const cairoCommonDescriptions = { 'Provides information for how much royalty is owed and to whom, based on a sale price. Follows ERC-2981 standard.', }; +export const cairoMacrosDescriptions = { + macros: 'The macros to use for the contract.', + withComponents: 'Whether to use the "with_components" macro for simplified contract structure.', +}; + export const cairoAlphaAccessDescriptions = { accessType: 'The type of access control to provision. Ownable is a simple mechanism with a single account authorized for all privileged actions. Roles is a flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. Roles (Default Admin Rules) provides additional enforced security measures on top of standard Roles mechanism for managing the most privileged role: default admin.', diff --git a/packages/core/cairo_alpha/CHANGELOG.md b/packages/core/cairo_alpha/CHANGELOG.md index f87ec5960..f4d4638ce 100644 --- a/packages/core/cairo_alpha/CHANGELOG.md +++ b/packages/core/cairo_alpha/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Add support for `with_components` macro. ([#703](https://github.com/OpenZeppelin/contracts-wizard/pull/703)) - Add AccessControlDefaultAdminRules. ([#698](https://github.com/OpenZeppelin/contracts-wizard/pull/698)) - **Breaking changes**: diff --git a/packages/core/cairo_alpha/ava.config.js b/packages/core/cairo_alpha/ava.config.js index e39146f7a..cbe7726dd 100644 --- a/packages/core/cairo_alpha/ava.config.js +++ b/packages/core/cairo_alpha/ava.config.js @@ -4,6 +4,7 @@ module.exports = { watchmode: { ignoreChanges: ['contracts', 'artifacts', 'cache'], }, + snapshotDir: '.', timeout: '10m', workerThreads: false, }; diff --git a/packages/core/cairo_alpha/src/account.test.ts.snap b/packages/core/cairo_alpha/src/account.test.ts.snap deleted file mode 100644 index 9d65ecb5d..000000000 Binary files a/packages/core/cairo_alpha/src/account.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/account.ts b/packages/core/cairo_alpha/src/account.ts index 10380232a..aa07b23b4 100644 --- a/packages/core/cairo_alpha/src/account.ts +++ b/packages/core/cairo_alpha/src/account.ts @@ -21,6 +21,7 @@ export const defaults: Required = { outsideExecution: true, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printAccount(opts: AccountOptions = defaults): string { @@ -49,9 +50,8 @@ function withDefaults(opts: AccountOptions): Required { export function buildAccount(opts: AccountOptions): Contract { const isAccount = true; - const c = new ContractBuilder(opts.name, isAccount); - const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros, isAccount); switch (allOpts.type) { case 'stark': @@ -59,7 +59,7 @@ export function buildAccount(opts: AccountOptions): Contract { c.addComponent(components.AccountComponent, [{ lit: 'public_key' }], true); break; case 'eth': - c.addUseClause('openzeppelin::interfaces::accounts', 'EthPublicKey'); + c.addUseClause('openzeppelin_interfaces::accounts', 'EthPublicKey'); c.addConstructorArgument({ name: 'public_key', type: 'EthPublicKey' }); c.addComponent(components.EthAccountComponent, [{ lit: 'public_key' }], true); break; @@ -98,10 +98,12 @@ function addSRC6(c: ContractBuilder, accountType: Account) { c.addImplToComponent(componentType, { name: 'SRC6Impl', + embed: true, value: `${baseComponent}::SRC6Impl`, }); c.addImplToComponent(componentType, { name: 'SRC6CamelOnlyImpl', + embed: true, value: `${baseComponent}::SRC6CamelOnlyImpl`, }); @@ -113,6 +115,7 @@ function addDeclarer(c: ContractBuilder, accountType: Account) { c.addImplToComponent(componentType, { name: 'DeclarerImpl', + embed: true, value: `${baseComponent}::DeclarerImpl`, }); } @@ -122,6 +125,7 @@ function addDeployer(c: ContractBuilder, accountType: Account) { c.addImplToComponent(componentType, { name: 'DeployableImpl', + embed: true, value: `${baseComponent}::DeployableImpl`, }); } @@ -131,16 +135,17 @@ function addPublicKey(c: ContractBuilder, accountType: Account) { c.addImplToComponent(componentType, { name: 'PublicKeyImpl', + embed: true, value: `${baseComponent}::PublicKeyImpl`, }); c.addImplToComponent(componentType, { name: 'PublicKeyCamelImpl', + embed: true, value: `${baseComponent}::PublicKeyCamelImpl`, }); } function addOutsideExecution(c: ContractBuilder) { - c.addUseClause('openzeppelin::account::extensions', 'SRC9Component'); c.addComponent(components.SRC9Component, [], true); } @@ -151,6 +156,7 @@ function addAccountMixin(c: ContractBuilder, accountType: Account) { c.addImplToComponent(componentType, { name: `${accountMixinImpl}`, value: `${baseComponent}::${accountMixinImpl}`, + embed: true, }); c.addInterfaceFlag('ISRC5'); @@ -167,7 +173,7 @@ function getBaseCompAndCompType(accountType: Account): [string, typeof component const components = defineComponents({ AccountComponent: { - path: 'openzeppelin::account', + path: 'openzeppelin_account', substorage: { name: 'account', type: 'AccountComponent::Storage', @@ -185,7 +191,7 @@ const components = defineComponents({ ], }, EthAccountComponent: { - path: 'openzeppelin::account::eth_account', + path: 'openzeppelin_account::eth_account', substorage: { name: 'eth_account', type: 'EthAccountComponent::Storage', @@ -203,7 +209,7 @@ const components = defineComponents({ ], }, SRC9Component: { - path: 'openzeppelin::account::extensions', + path: 'openzeppelin_account::extensions', substorage: { name: 'src9', type: 'SRC9Component::Storage', @@ -215,6 +221,7 @@ const components = defineComponents({ impls: [ { name: 'OutsideExecutionV2Impl', + embed: true, value: 'SRC9Component::OutsideExecutionV2Impl', }, { diff --git a/packages/core/cairo_alpha/src/add-pausable.ts b/packages/core/cairo_alpha/src/add-pausable.ts index 6d4f1c3c4..55d7fa073 100644 --- a/packages/core/cairo_alpha/src/add-pausable.ts +++ b/packages/core/cairo_alpha/src/add-pausable.ts @@ -17,7 +17,7 @@ export function addPausable(c: ContractBuilder, access: Access) { const components = defineComponents({ PausableComponent: { - path: 'openzeppelin::security::pausable', + path: 'openzeppelin_security::pausable', substorage: { name: 'pausable', type: 'PausableComponent::Storage', @@ -29,6 +29,7 @@ const components = defineComponents({ impls: [ { name: 'PausableImpl', + embed: true, value: 'PausableComponent::PausableImpl', }, { diff --git a/packages/core/cairo_alpha/src/common-components.ts b/packages/core/cairo_alpha/src/common-components.ts index b0c797ab1..1777d9329 100644 --- a/packages/core/cairo_alpha/src/common-components.ts +++ b/packages/core/cairo_alpha/src/common-components.ts @@ -6,7 +6,7 @@ export type Token = (typeof tokenTypes)[number]; const components = defineComponents({ SRC5Component: { - path: 'openzeppelin::introspection::src5', + path: 'openzeppelin_introspection::src5', substorage: { name: 'src5', type: 'SRC5Component::Storage', @@ -19,7 +19,7 @@ const components = defineComponents({ }, VotesComponent: { - path: 'openzeppelin::governance::votes', + path: 'openzeppelin_governance::votes', substorage: { name: 'votes', type: 'VotesComponent::Storage', @@ -38,7 +38,7 @@ const components = defineComponents({ }, NoncesComponent: { - path: 'openzeppelin::utils::cryptography::nonces', + path: 'openzeppelin_utils::cryptography::nonces', substorage: { name: 'nonces', type: 'NoncesComponent::Storage', @@ -50,6 +50,7 @@ const components = defineComponents({ impls: [ { name: 'NoncesImpl', + embed: true, value: 'NoncesComponent::NoncesImpl', }, ], @@ -62,6 +63,7 @@ export function addSRC5Component(c: ContractBuilder, section?: string) { if (!c.interfaceFlags.has('ISRC5')) { c.addImplToComponent(components.SRC5Component, { name: 'SRC5Impl', + embed: true, value: 'SRC5Component::SRC5Impl', section, }); @@ -75,13 +77,14 @@ export function addVotesComponent(c: ContractBuilder, name: string, version: str c.addComponent(components.VotesComponent, [], false); c.addImplToComponent(components.VotesComponent, { name: 'VotesImpl', + embed: true, value: `VotesComponent::VotesImpl`, }); - c.addUseClause('openzeppelin::utils::contract_clock', 'ERC6372TimestampClock'); + c.addUseClause('openzeppelin_utils::contract_clock', 'ERC6372TimestampClock'); } export function addSNIP12Metadata(c: ContractBuilder, name: string, version: string, section?: string) { - c.addUseClause('openzeppelin::utils::cryptography::snip12', 'SNIP12Metadata'); + c.addUseClause('openzeppelin_utils::cryptography::snip12', 'SNIP12Metadata'); const SNIP12Metadata: BaseImplementedTrait = { name: 'SNIP12MetadataImpl', diff --git a/packages/core/cairo_alpha/src/common-options.ts b/packages/core/cairo_alpha/src/common-options.ts index a179fcffe..6f5ce4938 100644 --- a/packages/core/cairo_alpha/src/common-options.ts +++ b/packages/core/cairo_alpha/src/common-options.ts @@ -4,10 +4,13 @@ import { AccessControl } from './set-access-control'; import type { Info } from './set-info'; import { defaults as infoDefaults } from './set-info'; import type { Upgradeable } from './set-upgradeable'; +import type { MacrosOptions } from './set-macros'; +import { defaults as macrosDefaults } from './set-macros'; export const defaults: Required = { upgradeable: true, info: infoDefaults, + macros: macrosDefaults, } as const; export const contractDefaults: Required = { @@ -18,6 +21,7 @@ export const contractDefaults: Required = { export interface CommonOptions { upgradeable?: Upgradeable; info?: Info; + macros?: MacrosOptions; } export interface CommonContractOptions extends CommonOptions { @@ -28,6 +32,7 @@ export function withCommonDefaults(opts: CommonOptions): Required return { upgradeable: opts.upgradeable ?? defaults.upgradeable, info: opts.info ?? defaults.info, + macros: opts.macros ?? defaults.macros, }; } diff --git a/packages/core/cairo_alpha/src/contract.test.ts.snap b/packages/core/cairo_alpha/src/contract.test.ts.snap deleted file mode 100644 index 0502c315c..000000000 Binary files a/packages/core/cairo_alpha/src/contract.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/contract.ts b/packages/core/cairo_alpha/src/contract.ts index ed9e63510..2543086dc 100644 --- a/packages/core/cairo_alpha/src/contract.ts +++ b/packages/core/cairo_alpha/src/contract.ts @@ -1,9 +1,11 @@ import { toIdentifier } from './utils/convert-strings'; +import type { MacrosOptions } from './set-macros'; export interface Contract { license: string; documentations: string[]; name: string; + macros: MacrosOptions; account: boolean; useClauses: UseClause[]; components: Component[]; @@ -46,7 +48,7 @@ export interface Event { export interface Impl { name: string; value: string; - embed?: boolean; + embed: boolean; section?: string; } @@ -100,6 +102,7 @@ export interface Argument { export class ContractBuilder implements Contract { readonly name: string; + readonly macros: MacrosOptions; readonly account: boolean; license = 'MIT'; upgradeable = false; @@ -116,8 +119,9 @@ export class ContractBuilder implements Contract { private useClausesMap: Map = new Map(); private interfaceFlagsSet: Set = new Set(); - constructor(name: string, account: boolean = false) { + constructor(name: string, macros: MacrosOptions, account: boolean = false) { this.name = toIdentifier(name, true); + this.macros = macros; this.account = account; } @@ -165,7 +169,9 @@ export class ContractBuilder implements Contract { } addComponent(component: Component, params: Value[] = [], initializable: boolean = true): boolean { - this.addUseClause(component.path, component.name); + if (!this.macros.withComponents) { + this.addUseClause(component.path, component.name); + } const key = component.name; const present = this.componentsMap.has(key); if (!present) { diff --git a/packages/core/cairo_alpha/src/custom.test.ts.snap b/packages/core/cairo_alpha/src/custom.test.ts.snap deleted file mode 100644 index 8762df1bb..000000000 Binary files a/packages/core/cairo_alpha/src/custom.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/custom.ts b/packages/core/cairo_alpha/src/custom.ts index 3fe6bc86a..444c604ed 100644 --- a/packages/core/cairo_alpha/src/custom.ts +++ b/packages/core/cairo_alpha/src/custom.ts @@ -15,6 +15,7 @@ export const defaults: Required = { access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printCustom(opts: CustomOptions = defaults): string { @@ -39,9 +40,8 @@ export function isAccessControlRequired(opts: Partial): boolean { } export function buildCustom(opts: CustomOptions): Contract { - const c = new ContractBuilder(opts.name); - const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); if (allOpts.pausable) { addPausable(c, allOpts.access); diff --git a/packages/core/cairo_alpha/src/erc1155.test.ts.snap b/packages/core/cairo_alpha/src/erc1155.test.ts.snap deleted file mode 100644 index 83cc4a12c..000000000 Binary files a/packages/core/cairo_alpha/src/erc1155.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/erc1155.ts b/packages/core/cairo_alpha/src/erc1155.ts index 78788a7f6..7e05a6a0e 100644 --- a/packages/core/cairo_alpha/src/erc1155.ts +++ b/packages/core/cairo_alpha/src/erc1155.ts @@ -28,6 +28,7 @@ export const defaults: Required = { access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printERC1155(opts: ERC1155Options = defaults): string { @@ -67,9 +68,8 @@ export function isAccessControlRequired(opts: Partial): boolean } export function buildERC1155(opts: ERC1155Options): Contract { - const c = new ContractBuilder(opts.name); - const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); addBase(c, toByteArray(allOpts.baseUri)); addERC1155Mixin(c); @@ -127,13 +127,14 @@ function addHooks(c: ContractBuilder, allOpts: Required) { code: ['let contract_state = self.get_contract()', 'contract_state.pausable.assert_not_paused()'], }); } else { - c.addUseClause('openzeppelin::token::erc1155', 'ERC1155HooksEmptyImpl'); + c.addUseClause('openzeppelin_token::erc1155', 'ERC1155HooksEmptyImpl'); } } function addERC1155Mixin(c: ContractBuilder) { c.addImplToComponent(components.ERC1155Component, { name: 'ERC1155MixinImpl', + embed: true, value: 'ERC1155Component::ERC1155MixinImpl', }); c.addInterfaceFlag('ISRC5'); @@ -170,7 +171,7 @@ function addSetBaseUri(c: ContractBuilder, access: Access) { const components = defineComponents({ ERC1155Component: { - path: 'openzeppelin::token::erc1155', + path: 'openzeppelin_token::erc1155', substorage: { name: 'erc1155', type: 'ERC1155Component::Storage', diff --git a/packages/core/cairo_alpha/src/erc20.test.ts.snap b/packages/core/cairo_alpha/src/erc20.test.ts.snap deleted file mode 100644 index 08f1ada47..000000000 Binary files a/packages/core/cairo_alpha/src/erc20.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/erc20.ts b/packages/core/cairo_alpha/src/erc20.ts index 187ff56b9..10d2dfbee 100644 --- a/packages/core/cairo_alpha/src/erc20.ts +++ b/packages/core/cairo_alpha/src/erc20.ts @@ -32,6 +32,7 @@ export const defaults: Required = { access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printERC20(opts: ERC20Options = defaults): string { @@ -71,8 +72,8 @@ export function isAccessControlRequired(opts: Partial): boolean { } export function buildERC20(opts: ERC20Options): Contract { - const c = new ContractBuilder(opts.name); const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); const decimals = toUint(allOpts.decimals, 'decimals', 'u8'); addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol), decimals); @@ -177,13 +178,14 @@ function addHooks(c: ContractBuilder, allOpts: Required) { ); } } else { - c.addUseClause('openzeppelin::token::erc20', 'ERC20HooksEmptyImpl'); + c.addUseClause('openzeppelin_token::erc20', 'ERC20HooksEmptyImpl'); } } function addERC20Mixin(c: ContractBuilder) { c.addImplToComponent(components.ERC20Component, { name: 'ERC20MixinImpl', + embed: true, value: 'ERC20Component::ERC20MixinImpl', }); } @@ -194,7 +196,7 @@ function addBase(c: ContractBuilder, name: string, symbol: string, decimals: big // Add config with decimals if (decimals === DEFAULT_DECIMALS) { - c.addUseClause('openzeppelin::token::erc20', 'DefaultConfig', { alias: 'ERC20DefaultConfig' }); + c.addUseClause('openzeppelin_token::erc20', 'DefaultConfig', { alias: 'ERC20DefaultConfig' }); } else { const trait: BaseImplementedTrait = { name: 'ERC20ImmutableConfig', @@ -281,7 +283,7 @@ function addMintable(c: ContractBuilder, access: Access) { const components = defineComponents({ ERC20Component: { - path: 'openzeppelin::token::erc20', + path: 'openzeppelin_token::erc20', substorage: { name: 'erc20', type: 'ERC20Component::Storage', diff --git a/packages/core/cairo_alpha/src/erc721.test.ts.snap b/packages/core/cairo_alpha/src/erc721.test.ts.snap deleted file mode 100644 index f6409227c..000000000 Binary files a/packages/core/cairo_alpha/src/erc721.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/erc721.ts b/packages/core/cairo_alpha/src/erc721.ts index 6ddaf2efd..4290f4ec0 100644 --- a/packages/core/cairo_alpha/src/erc721.ts +++ b/packages/core/cairo_alpha/src/erc721.ts @@ -33,6 +33,7 @@ export const defaults: Required = { access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printERC721(opts: ERC721Options = defaults): string { @@ -76,9 +77,8 @@ export function isAccessControlRequired(opts: Partial): boolean { } export function buildERC721(opts: ERC721Options): Contract { - const c = new ContractBuilder(opts.name); - const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol), toByteArray(allOpts.baseUri)); addERC721Mixin(c); @@ -168,13 +168,14 @@ function addHooks(c: ContractBuilder, opts: Required) { code: beforeUpdateCode, }); } else { - c.addUseClause('openzeppelin::token::erc721', 'ERC721HooksEmptyImpl'); + c.addUseClause('openzeppelin_token::erc721', 'ERC721HooksEmptyImpl'); } } function addERC721Mixin(c: ContractBuilder) { c.addImplToComponent(components.ERC721Component, { name: 'ERC721MixinImpl', + embed: true, value: 'ERC721Component::ERC721MixinImpl', }); c.addInterfaceFlag('ISRC5'); @@ -206,7 +207,7 @@ function addMintable(c: ContractBuilder, access: Access) { const components = defineComponents({ ERC721Component: { - path: 'openzeppelin::token::erc721', + path: 'openzeppelin_token::erc721', substorage: { name: 'erc721', type: 'ERC721Component::Storage', @@ -224,7 +225,7 @@ const components = defineComponents({ ], }, ERC721EnumerableComponent: { - path: 'openzeppelin::token::erc721::extensions', + path: 'openzeppelin_token::erc721::extensions', substorage: { name: 'erc721_enumerable', type: 'ERC721EnumerableComponent::Storage', @@ -236,6 +237,7 @@ const components = defineComponents({ impls: [ { name: 'ERC721EnumerableImpl', + embed: true, value: 'ERC721EnumerableComponent::ERC721EnumerableImpl', }, { diff --git a/packages/core/cairo_alpha/src/generate/account.ts b/packages/core/cairo_alpha/src/generate/account.ts index 175ba8df9..4d995419a 100644 --- a/packages/core/cairo_alpha/src/generate/account.ts +++ b/packages/core/cairo_alpha/src/generate/account.ts @@ -2,20 +2,30 @@ import { accountTypes, type AccountOptions } from '../account'; import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; const booleans = [true, false]; -const blueprint = { - name: ['MyAccount'], - type: accountTypes, - declare: booleans, - deploy: booleans, - pubkey: booleans, - outsideExecution: booleans, - upgradeable: upgradeableOptions, - info: infoOptions, +type GeneratorOptions = { + macros: MacrosSubset; }; -export function* generateAccountOptions(): Generator> { +function prepareBlueprint(opts: GeneratorOptions) { + return { + name: ['MyAccount'], + type: accountTypes, + declare: booleans, + deploy: booleans, + pubkey: booleans, + outsideExecution: booleans, + upgradeable: upgradeableOptions, + info: infoOptions, + macros: resolveMacrosOptions(opts.macros), + }; +} + +export function* generateAccountOptions(opts: GeneratorOptions): Generator> { + const blueprint = prepareBlueprint(opts); yield* generateAlternatives(blueprint); } diff --git a/packages/core/cairo_alpha/src/generate/custom.ts b/packages/core/cairo_alpha/src/generate/custom.ts index 9e7772503..b7bb08894 100644 --- a/packages/core/cairo_alpha/src/generate/custom.ts +++ b/packages/core/cairo_alpha/src/generate/custom.ts @@ -4,11 +4,14 @@ import { resolveAccessControlOptions } from '../set-access-control'; import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; const booleans = [true, false]; type GeneratorOptions = { access: AccessSubset; + macros: MacrosSubset; }; function prepareBlueprint(opts: GeneratorOptions) { @@ -18,6 +21,7 @@ function prepareBlueprint(opts: GeneratorOptions) { access: resolveAccessControlOptions(opts.access), upgradeable: upgradeableOptions, info: infoOptions, + macros: resolveMacrosOptions(opts.macros), }; } diff --git a/packages/core/cairo_alpha/src/generate/erc1155.ts b/packages/core/cairo_alpha/src/generate/erc1155.ts index 74cc016a3..27ce7c45c 100644 --- a/packages/core/cairo_alpha/src/generate/erc1155.ts +++ b/packages/core/cairo_alpha/src/generate/erc1155.ts @@ -5,6 +5,8 @@ import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; import type { RoyaltyInfoSubset } from '../set-royalty-info'; import { resolveRoyaltyOptionsSubset } from '../set-royalty-info'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; import { generateAlternatives } from './alternatives'; const booleans = [true, false]; @@ -12,10 +14,10 @@ const booleans = [true, false]; type GeneratorOptions = { access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }; function prepareBlueprint(opts: GeneratorOptions) { - const royaltyInfo = resolveRoyaltyOptionsSubset(opts.royaltyInfo); return { name: ['MyToken'], baseUri: ['https://example.com/'], @@ -24,9 +26,10 @@ function prepareBlueprint(opts: GeneratorOptions) { mintable: booleans, updatableUri: booleans, upgradeable: upgradeableOptions, - royaltyInfo, + royaltyInfo: resolveRoyaltyOptionsSubset(opts.royaltyInfo), access: resolveAccessControlOptions(opts.access), info: infoOptions, + macros: resolveMacrosOptions(opts.macros), }; } diff --git a/packages/core/cairo_alpha/src/generate/erc20.ts b/packages/core/cairo_alpha/src/generate/erc20.ts index c652aaf27..84b0e22a4 100644 --- a/packages/core/cairo_alpha/src/generate/erc20.ts +++ b/packages/core/cairo_alpha/src/generate/erc20.ts @@ -4,10 +4,13 @@ import { resolveAccessControlOptions } from '../set-access-control'; import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; const booleans = [true, false]; type GeneratorOptions = { + macros: MacrosSubset; access: AccessSubset; }; @@ -26,6 +29,7 @@ function prepareBlueprint(opts: GeneratorOptions) { access: resolveAccessControlOptions(opts.access), upgradeable: upgradeableOptions, info: infoOptions, + macros: resolveMacrosOptions(opts.macros), }; } diff --git a/packages/core/cairo_alpha/src/generate/erc721.ts b/packages/core/cairo_alpha/src/generate/erc721.ts index 461fe0e09..cc39f604c 100644 --- a/packages/core/cairo_alpha/src/generate/erc721.ts +++ b/packages/core/cairo_alpha/src/generate/erc721.ts @@ -6,16 +6,18 @@ import { upgradeableOptions } from '../set-upgradeable'; import type { RoyaltyInfoSubset } from '../set-royalty-info'; import { resolveRoyaltyOptionsSubset } from '../set-royalty-info'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; const booleans = [true, false]; type GeneratorOptions = { access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }; function prepareBlueprint(opts: GeneratorOptions) { - const royaltyInfo = resolveRoyaltyOptionsSubset(opts.royaltyInfo); return { name: ['MyToken'], symbol: ['MTK'], @@ -27,10 +29,11 @@ function prepareBlueprint(opts: GeneratorOptions) { appVersion: ['v1'], pausable: booleans, mintable: booleans, - royaltyInfo, + royaltyInfo: resolveRoyaltyOptionsSubset(opts.royaltyInfo), access: resolveAccessControlOptions(opts.access), upgradeable: upgradeableOptions, info: [infoDefaults], + macros: resolveMacrosOptions(opts.macros), }; } diff --git a/packages/core/cairo_alpha/src/generate/governor.ts b/packages/core/cairo_alpha/src/generate/governor.ts index 9cb8d6f26..ca10f8fde 100644 --- a/packages/core/cairo_alpha/src/generate/governor.ts +++ b/packages/core/cairo_alpha/src/generate/governor.ts @@ -3,28 +3,38 @@ import { clockModeOptions, quorumModeOptions, timelockOptions, votesOptions } fr import { infoOptions } from '../set-info'; import { upgradeableOptions } from '../set-upgradeable'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; const booleans = [true, false]; -const blueprint = { - name: ['MyGovernor'], - delay: ['1 day'], - period: ['1 week'], - proposalThreshold: ['1'], - decimals: [18], - quorumMode: quorumModeOptions, - quorumPercent: [10], - quorumAbsolute: ['10'], - votes: votesOptions, - clockMode: clockModeOptions, - timelock: timelockOptions, - settings: booleans, - appName: ['Openzeppelin Governor'], - appVersion: ['v1'], - upgradeable: upgradeableOptions, - info: infoOptions, +type GeneratorOptions = { + macros: MacrosSubset; }; -export function* generateGovernorOptions(): Generator> { +function prepareBlueprint(opts: GeneratorOptions) { + return { + name: ['MyGovernor'], + delay: ['1 day'], + period: ['1 week'], + proposalThreshold: ['1'], + decimals: [18], + quorumMode: quorumModeOptions, + quorumPercent: [10], + quorumAbsolute: ['10'], + votes: votesOptions, + clockMode: clockModeOptions, + timelock: timelockOptions, + settings: booleans, + appName: ['Openzeppelin Governor'], + appVersion: ['v1'], + upgradeable: upgradeableOptions, + info: infoOptions, + macros: resolveMacrosOptions(opts.macros), + }; +} + +export function* generateGovernorOptions(opts: GeneratorOptions): Generator> { + const blueprint = prepareBlueprint(opts); yield* generateAlternatives(blueprint); } diff --git a/packages/core/cairo_alpha/src/generate/multisig.ts b/packages/core/cairo_alpha/src/generate/multisig.ts index fac48e789..c5705c332 100644 --- a/packages/core/cairo_alpha/src/generate/multisig.ts +++ b/packages/core/cairo_alpha/src/generate/multisig.ts @@ -1,14 +1,24 @@ import { infoOptions } from '../set-info'; import type { MultisigOptions } from '../multisig'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; -const blueprint = { - name: ['MyMultisig'], - quorum: ['1', '2', '42'], - upgradeable: [true, false], - info: infoOptions, +type GeneratorOptions = { + macros: MacrosSubset; }; -export function* generateMultisigOptions(): Generator> { +function prepareBlueprint(opts: GeneratorOptions) { + return { + name: ['MyMultisig'], + quorum: ['1', '2', '42'], + upgradeable: [true, false], + info: infoOptions, + macros: resolveMacrosOptions(opts.macros), + }; +} + +export function* generateMultisigOptions(opts: GeneratorOptions): Generator> { + const blueprint = prepareBlueprint(opts); yield* generateAlternatives(blueprint); } diff --git a/packages/core/cairo_alpha/src/generate/sources.ts b/packages/core/cairo_alpha/src/generate/sources.ts index 4a407e4ea..0d458374e 100644 --- a/packages/core/cairo_alpha/src/generate/sources.ts +++ b/packages/core/cairo_alpha/src/generate/sources.ts @@ -17,6 +17,7 @@ import { OptionsError } from '../error'; import { findCover } from '../utils/find-cover'; import type { Contract } from '../contract'; import type { RoyaltyInfoSubset } from '../set-royalty-info'; +import type { MacrosSubset } from '../set-macros'; import type { AccessSubset } from '../set-access-control'; export type Subset = 'all' | 'minimal-cover'; @@ -27,52 +28,53 @@ export function* generateOptions(params: { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }): Generator { - const { kind, access, royaltyInfo } = params; + const { kind, access, royaltyInfo, macros } = params; if (kind === 'all' || kind === 'ERC20') { - for (const kindOpts of generateERC20Options({ access })) { + for (const kindOpts of generateERC20Options({ access, macros })) { yield { kind: 'ERC20', ...kindOpts }; } } if (kind === 'all' || kind === 'ERC721') { - for (const kindOpts of generateERC721Options({ access, royaltyInfo })) { + for (const kindOpts of generateERC721Options({ access, royaltyInfo, macros })) { yield { kind: 'ERC721', ...kindOpts }; } } if (kind === 'all' || kind === 'ERC1155') { - for (const kindOpts of generateERC1155Options({ access, royaltyInfo })) { + for (const kindOpts of generateERC1155Options({ access, royaltyInfo, macros })) { yield { kind: 'ERC1155', ...kindOpts }; } } if (kind === 'all' || kind === 'Account') { - for (const kindOpts of generateAccountOptions()) { + for (const kindOpts of generateAccountOptions({ macros })) { yield { kind: 'Account', ...kindOpts }; } } if (kind === 'all' || kind === 'Multisig') { - for (const kindOpts of generateMultisigOptions()) { + for (const kindOpts of generateMultisigOptions({ macros })) { yield { kind: 'Multisig', ...kindOpts }; } } if (kind === 'all' || kind === 'Governor') { - for (const kindOpts of generateGovernorOptions()) { + for (const kindOpts of generateGovernorOptions({ macros })) { yield { kind: 'Governor', ...kindOpts }; } } if (kind === 'all' || kind === 'Vesting') { - for (const kindOpts of generateVestingOptions()) { + for (const kindOpts of generateVestingOptions({ macros })) { yield { kind: 'Vesting', ...kindOpts }; } } if (kind === 'all' || kind === 'Custom') { - for (const kindOpts of generateCustomOptions({ access })) { + for (const kindOpts of generateCustomOptions({ access, macros })) { yield { kind: 'Custom', ...kindOpts }; } } @@ -93,11 +95,12 @@ function generateContractSubset(params: { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }): GeneratedContract[] { - const { subset, kind, access, royaltyInfo } = params; + const { subset, kind, access, royaltyInfo, macros } = params; const contracts = []; - for (const options of generateOptions({ kind, access, royaltyInfo })) { + for (const options of generateOptions({ kind, access, royaltyInfo, macros })) { const id = crypto.createHash('sha1').update(JSON.stringify(options)).digest().toString('hex'); try { const contract = buildGeneric(options); @@ -148,10 +151,11 @@ export function* generateSources(params: { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }): Generator { - const { subset, uniqueName, kind, access, royaltyInfo } = params; + const { subset, uniqueName, kind, access, royaltyInfo, macros } = params; let counter = 1; - for (const c of generateContractSubset({ subset, kind, access, royaltyInfo })) { + for (const c of generateContractSubset({ subset, kind, access, royaltyInfo, macros })) { if (uniqueName) { c.contract.name = `Contract${counter++}`; } @@ -167,19 +171,20 @@ export async function writeGeneratedSources(params: { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; logsEnabled: boolean; }): Promise { - const { dir, subset, uniqueName, kind, access, royaltyInfo, logsEnabled } = params; + const { dir, subset, uniqueName, kind, access, royaltyInfo, macros, logsEnabled } = params; await fs.mkdir(dir, { recursive: true }); const contractNames = []; - for (const { id, contract, source } of generateSources({ subset, uniqueName, kind, access, royaltyInfo })) { + for (const { id, contract, source } of generateSources({ subset, uniqueName, kind, access, royaltyInfo, macros })) { const name = uniqueName ? contract.name : id; await fs.writeFile(path.format({ dir, name, ext: '.cairo' }), source); contractNames.push(name); } if (logsEnabled) { - const sourceLabel = resolveSourceLabel({ kind, access, royaltyInfo }); + const sourceLabel = resolveSourceLabel({ kind, access, royaltyInfo, macros }); console.log(`Generated ${contractNames.length} contracts for ${sourceLabel}`); } @@ -190,9 +195,15 @@ function resolveSourceLabel(params: { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }): string { - const { kind, access, royaltyInfo } = params; - return [resolveKindLabel(kind), resolveAccessLabel(kind, access), resolveRoyaltyInfoLabel(kind, royaltyInfo)] + const { kind, access, royaltyInfo, macros } = params; + return [ + resolveKindLabel(kind), + resolveMacrosLabel(macros), + resolveAccessLabel(kind, access), + resolveRoyaltyInfoLabel(kind, royaltyInfo), + ] .filter(elem => elem !== undefined) .join(', '); } @@ -237,6 +248,10 @@ function resolveAccessLabel(kind: KindSubset, access: AccessSubset): string | un } } +function resolveMacrosLabel(macros: MacrosSubset): string { + return `macros: ${macros}`; +} + function resolveRoyaltyInfoLabel(kind: KindSubset, royaltyInfo: RoyaltyInfoSubset): string | undefined { switch (kind) { case 'all': diff --git a/packages/core/cairo_alpha/src/generate/vesting.ts b/packages/core/cairo_alpha/src/generate/vesting.ts index 9be2e455d..71aee91a1 100644 --- a/packages/core/cairo_alpha/src/generate/vesting.ts +++ b/packages/core/cairo_alpha/src/generate/vesting.ts @@ -1,16 +1,26 @@ import { infoOptions } from '../set-info'; import type { VestingOptions } from '../vesting'; import { generateAlternatives } from './alternatives'; +import type { MacrosSubset } from '../set-macros'; +import { resolveMacrosOptions } from '../set-macros'; -const blueprint = { - name: ['MyVesting'], - startDate: ['2024-12-31T23:59'], - duration: ['90 days', '1 year'], - cliffDuration: ['0 seconds', '30 day'], - schedule: ['linear', 'custom'] as const, - info: infoOptions, +type GeneratorOptions = { + macros: MacrosSubset; }; -export function* generateVestingOptions(): Generator> { +function prepareBlueprint(opts: GeneratorOptions) { + return { + name: ['MyVesting'], + startDate: ['2024-12-31T23:59'], + duration: ['90 days', '1 year'], + cliffDuration: ['0 seconds', '30 day'], + schedule: ['linear', 'custom'] as const, + info: infoOptions, + macros: resolveMacrosOptions(opts.macros), + }; +} + +export function* generateVestingOptions(opts: GeneratorOptions): Generator> { + const blueprint = prepareBlueprint(opts); yield* generateAlternatives(blueprint); } diff --git a/packages/core/cairo_alpha/src/governor.test.ts.snap b/packages/core/cairo_alpha/src/governor.test.ts.snap deleted file mode 100644 index 7ed14d42c..000000000 Binary files a/packages/core/cairo_alpha/src/governor.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/governor.ts b/packages/core/cairo_alpha/src/governor.ts index 7268fd387..42b7d4a39 100644 --- a/packages/core/cairo_alpha/src/governor.ts +++ b/packages/core/cairo_alpha/src/governor.ts @@ -14,7 +14,7 @@ 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 extensionPath = 'openzeppelin_governance::governor::extensions'; const extensionExternalSection = 'Extensions (external)'; const extensionInternalSection = 'Extensions (internal)'; @@ -35,6 +35,7 @@ export const defaults: Required = { appName: 'OpenZeppelin Governor', appVersion: 'v1', info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export const quorumModeOptions = ['percent', 'absolute'] as const; @@ -88,8 +89,7 @@ function withDefaults(opts: GovernorOptions): Required { export function buildGovernor(opts: GovernorOptions): Contract { const allOpts = withDefaults(opts); - - const c = new ContractBuilder(allOpts.name); + const c = new ContractBuilder(allOpts.name, allOpts.macros); validateDecimals(allOpts.decimals); @@ -108,7 +108,7 @@ export function buildGovernor(opts: GovernorOptions): Contract { const components = defineComponents({ GovernorComponent: { - path: 'openzeppelin::governance::governor', + path: 'openzeppelin_governance::governor', substorage: { name: 'governor', type: 'GovernorComponent::Storage', @@ -120,6 +120,7 @@ const components = defineComponents({ impls: [ { name: 'GovernorImpl', + embed: true, value: 'GovernorComponent::GovernorImpl', section: 'Governor Core', }, @@ -138,13 +139,14 @@ const components = defineComponents({ impls: [ { name: 'GovernorSettingsAdminImpl', + embed: true, value: 'GovernorSettingsComponent::GovernorSettingsAdminImpl', section: extensionExternalSection, }, { name: 'GovernorSettingsImpl', - value: 'GovernorSettingsComponent::GovernorSettings', embed: false, + value: 'GovernorSettingsComponent::GovernorSettings', section: extensionInternalSection, }, ], @@ -162,13 +164,14 @@ const components = defineComponents({ impls: [ { name: 'VotesTokenImpl', + embed: true, value: 'GovernorVotesComponent::VotesTokenImpl', section: extensionExternalSection, }, { name: 'GovernorVotesImpl', - value: 'GovernorVotesComponent::GovernorVotes', embed: false, + value: 'GovernorVotesComponent::GovernorVotes', section: extensionInternalSection, }, ], @@ -176,7 +179,7 @@ const components = defineComponents({ GovernorVotesQuorumFractionComponent: { path: extensionPath, substorage: { - name: 'governor_votes', + name: 'governor_votes_quorum_fraction', type: 'GovernorVotesQuorumFractionComponent::Storage', }, event: { @@ -186,18 +189,19 @@ const components = defineComponents({ impls: [ { name: 'GovernorQuorumImpl', - value: 'GovernorVotesQuorumFractionComponent::GovernorQuorum', embed: false, + value: 'GovernorVotesQuorumFractionComponent::GovernorQuorum', section: extensionInternalSection, }, { name: 'GovernorVotesImpl', - value: 'GovernorVotesQuorumFractionComponent::GovernorVotes', embed: false, + value: 'GovernorVotesQuorumFractionComponent::GovernorVotes', section: extensionInternalSection, }, { name: 'QuorumFractionImpl', + embed: true, value: 'GovernorVotesQuorumFractionComponent::QuorumFractionImpl', section: extensionExternalSection, }, @@ -206,7 +210,7 @@ const components = defineComponents({ GovernorCountingSimpleComponent: { path: extensionPath, substorage: { - name: 'governor_counting', + name: 'governor_counting_simple', type: 'GovernorCountingSimpleComponent::Storage', }, event: { @@ -216,8 +220,8 @@ const components = defineComponents({ impls: [ { name: 'GovernorCountingSimpleImpl', - value: 'GovernorCountingSimpleComponent::GovernorCounting', embed: false, + value: 'GovernorCountingSimpleComponent::GovernorCounting', section: extensionInternalSection, }, ], @@ -225,7 +229,7 @@ const components = defineComponents({ GovernorCoreExecutionComponent: { path: extensionPath, substorage: { - name: 'governor_execution', + name: 'governor_core_execution', type: 'GovernorCoreExecutionComponent::Storage', }, event: { @@ -235,8 +239,8 @@ const components = defineComponents({ impls: [ { name: 'GovernorCoreExecutionImpl', - value: 'GovernorCoreExecutionComponent::GovernorExecution', embed: false, + value: 'GovernorCoreExecutionComponent::GovernorExecution', section: extensionInternalSection, }, ], @@ -254,13 +258,14 @@ const components = defineComponents({ impls: [ { name: 'TimelockedImpl', + embed: true, value: 'GovernorTimelockExecutionComponent::TimelockedImpl', section: extensionExternalSection, }, { name: 'GovernorTimelockExecutionImpl', - value: 'GovernorTimelockExecutionComponent::GovernorExecution', embed: false, + value: 'GovernorTimelockExecutionComponent::GovernorExecution', section: extensionInternalSection, }, ], @@ -269,9 +274,9 @@ const components = defineComponents({ function addBase(c: ContractBuilder, _: GovernorOptions) { c.addUseClause('starknet', 'ContractAddress'); - c.addUseClause('openzeppelin::governance::governor', 'DefaultConfig', { alias: 'GovernorDefaultConfig' }); + c.addUseClause('openzeppelin_governance::governor', 'DefaultConfig', { alias: 'GovernorDefaultConfig' }); c.addConstructorArgument({ name: 'votes_token', type: 'ContractAddress' }); - c.addUseClause('openzeppelin::governance::governor::GovernorComponent', 'InternalTrait', { + c.addUseClause('openzeppelin_governance::governor::GovernorComponent', 'InternalTrait', { alias: 'GovernorInternalTrait', }); c.addComponent(components.GovernorComponent, [], true); diff --git a/packages/core/cairo_alpha/src/index.ts b/packages/core/cairo_alpha/src/index.ts index 25d51a165..0c376fb8b 100644 --- a/packages/core/cairo_alpha/src/index.ts +++ b/packages/core/cairo_alpha/src/index.ts @@ -11,11 +11,13 @@ export type { Account } from './account'; export type { Upgradeable } from './set-upgradeable'; export type { Info } from './set-info'; export type { RoyaltyInfoOptions } from './set-royalty-info'; +export type { MacrosOptions } from './set-macros'; export { premintPattern } from './erc20'; export { defaults as infoDefaults } from './set-info'; export { defaults as royaltyInfoDefaults } from './set-royalty-info'; +export { defaults as macrosDefaults } from './set-macros'; export type { OptionsErrorMessages } from './error'; export { OptionsError } from './error'; diff --git a/packages/core/cairo_alpha/src/multisig.test.ts.snap b/packages/core/cairo_alpha/src/multisig.test.ts.snap deleted file mode 100644 index 697aa1681..000000000 Binary files a/packages/core/cairo_alpha/src/multisig.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/multisig.ts b/packages/core/cairo_alpha/src/multisig.ts index 757ba2b7e..4d901a5c6 100644 --- a/packages/core/cairo_alpha/src/multisig.ts +++ b/packages/core/cairo_alpha/src/multisig.ts @@ -1,7 +1,7 @@ import type { Contract } from './contract'; import { ContractBuilder } from './contract'; import type { CommonOptions } from './common-options'; -import { contractDefaults as commonDefaults } from './common-options'; +import { contractDefaults as commonDefaults, withCommonDefaults } from './common-options'; import { setAccessControl, AccessControl } from './set-access-control'; import { setUpgradeableMultisig } from './set-upgradeable'; import { setInfo } from './set-info'; @@ -15,6 +15,7 @@ export const defaults: Required = { quorum: '2', upgradeable: commonDefaults.upgradeable, info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printMultisig(opts: MultisigOptions = defaults): string { @@ -28,18 +29,17 @@ export interface MultisigOptions extends CommonOptions { function withDefaults(opts: MultisigOptions): Required { return { - name: opts.name ?? defaults.name, + ...opts, + ...withCommonDefaults(opts), quorum: opts.quorum ?? defaults.quorum, - upgradeable: opts.upgradeable ?? defaults.upgradeable, - info: opts.info ?? defaults.info, }; } export function buildMultisig(opts: MultisigOptions): Contract { - const c = new ContractBuilder(opts.name); const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); - addBase(c, opts); + addBase(c, allOpts); setInfo(c, allOpts.info); setUpgradeableMultisig(c, allOpts.upgradeable); @@ -85,7 +85,7 @@ function getQuorum(opts: MultisigOptions): bigint { const components = defineComponents({ MultisigComponent: { - path: 'openzeppelin::governance::multisig', + path: 'openzeppelin_governance::multisig', substorage: { name: 'multisig', type: 'MultisigComponent::Storage', @@ -97,6 +97,7 @@ const components = defineComponents({ impls: [ { name: 'MultisigImpl', + embed: true, value: 'MultisigComponent::MultisigImpl', }, { diff --git a/packages/core/cairo_alpha/src/print.ts b/packages/core/cairo_alpha/src/print.ts index ecac44fa2..817ba2925 100644 --- a/packages/core/cairo_alpha/src/print.ts +++ b/packages/core/cairo_alpha/src/print.ts @@ -20,6 +20,23 @@ const STANDALONE_IMPORTS_GROUP = 'Standalone Imports'; const MAX_USE_CLAUSE_LINE_LENGTH = 90; const TAB = '\t'; +function printWithComponentsDirective(contract: Contract): Lines[] { + if (!contract.macros.withComponents || contract.components.length === 0) { + return []; + } + const componentsStr = contract.components + .map(c => c.name) + .map(name => { + const idx = name.indexOf('Component'); + if (idx === -1) { + throw new Error(`Component name "${name}" must contain "Component" substring`); + } + return name.substring(0, idx); + }) + .join(', '); + return [`#[with_components(${componentsStr})]`]; +} + export function printContract(contract: Contract): string { const contractAttribute = contract.account ? '#[starknet::contract(account)]' : '#[starknet::contract]'; return formatLines( @@ -32,6 +49,7 @@ export function printContract(contract: Contract): string { [ ...printDocumentations(contract.documentations), `${contractAttribute}`, + ...printWithComponentsDirective(contract), `mod ${contract.name} {`, spaceBetween( printUseClauses(contract), @@ -156,18 +174,17 @@ function printConstants(constants: Variable[]): Lines[] { } function printComponentDeclarations(contract: Contract): Lines[] { - const lines = []; - for (const component of contract.components) { - lines.push( - `component!(path: ${component.name}, storage: ${component.substorage.name}, event: ${component.event.name});`, - ); + if (contract.macros.withComponents) { + return []; } - return lines; + return contract.components.map( + c => `component!(path: ${c.name}, storage: ${c.substorage.name}, event: ${c.event.name});`, + ); } function printImpls(contract: Contract): Lines[] { - const impls = contract.components.flatMap(c => c.impls); - + const withComponents = contract.macros.withComponents; + const impls = contract.components.flatMap(c => (withComponents ? c.impls.filter(i => i.embed) : c.impls)); // group by section const grouped = impls.reduce((result: { [section: string]: Impl[] }, current: Impl) => { // default section depends on embed @@ -202,35 +219,28 @@ function printImpl(impl: Impl): Lines[] { } function printStorage(contract: Contract): (string | string[])[] { - const lines = []; - // storage is required regardless of whether there are components - lines.push('#[storage]'); - lines.push('struct Storage {'); + if (contract.macros.withComponents || contract.components.length === 0) { + // storage is required regardless of whether there are components + return ['#[storage]', 'struct Storage {}']; + } const storageLines = []; for (const component of contract.components) { storageLines.push(`#[substorage(v0)]`); storageLines.push(`${component.substorage.name}: ${component.substorage.type},`); } - lines.push(storageLines); - lines.push('}'); - return lines; + return ['#[storage]', 'struct Storage {', storageLines, '}']; } function printEvents(contract: Contract): (string | string[])[] { - const lines = []; - if (contract.components.length > 0) { - lines.push('#[event]'); - lines.push('#[derive(Drop, starknet::Event)]'); - lines.push('enum Event {'); - const eventLines = []; - for (const component of contract.components) { - eventLines.push('#[flat]'); - eventLines.push(`${component.event.name}: ${component.event.type},`); - } - lines.push(eventLines); - lines.push('}'); + if (contract.macros.withComponents || contract.components.length === 0) { + return []; } - return lines; + const eventLines = []; + for (const component of contract.components) { + eventLines.push('#[flat]'); + eventLines.push(`${component.event.name}: ${component.event.type},`); + } + return ['#[event]', '#[derive(Drop, starknet::Event)]', 'enum Event {', eventLines, '}']; } function printImplementedTraits(contract: Contract): Lines[] { diff --git a/packages/core/cairo_alpha/src/scripts/update-scarb-project.ts b/packages/core/cairo_alpha/src/scripts/update-scarb-project.ts index 26f894f99..fbb4c1a05 100644 --- a/packages/core/cairo_alpha/src/scripts/update-scarb-project.ts +++ b/packages/core/cairo_alpha/src/scripts/update-scarb-project.ts @@ -4,6 +4,7 @@ import path from 'path'; import type { KindSubset } from '../generate/sources'; import type { AccessSubset } from '../set-access-control'; import type { RoyaltyInfoSubset } from '../set-royalty-info'; +import type { MacrosSubset } from '../set-macros'; import { writeGeneratedSources } from '../generate/sources'; import { contractsVersion, edition, cairoVersion, scarbVersion } from '../utils/version'; @@ -11,10 +12,12 @@ type Arguments = { kind: KindSubset; access: AccessSubset; royaltyInfo: RoyaltyInfoSubset; + macros: MacrosSubset; }; const defaults: Arguments = { kind: 'all', + macros: 'all', access: 'all', royaltyInfo: 'all', } as const; @@ -24,6 +27,7 @@ export function resolveArguments(): Arguments { const args = parseCliArgs(cliArgs); return { kind: parseKindSubset(args.kind ?? defaults.kind), + macros: parseMacrosSubset(args.macros ?? defaults.macros), access: parseAccessSubset(args.access ?? defaults.access), royaltyInfo: parseRoyaltyInfoSubset(args.royalty ?? defaults.royaltyInfo), }; @@ -34,7 +38,7 @@ export async function updateScarbProject() { await fs.rm(generatedSourcesPath, { force: true, recursive: true }); // Generate the contracts source code - const { kind, access, royaltyInfo } = resolveArguments(); + const { kind, macros, access, royaltyInfo } = resolveArguments(); const contractNames = await writeGeneratedSources({ dir: generatedSourcesPath, subset: 'all', @@ -42,6 +46,7 @@ export async function updateScarbProject() { kind, access, royaltyInfo, + macros, logsEnabled: true, }); @@ -169,4 +174,19 @@ function parseRoyaltyInfoSubset(value: string | undefined): RoyaltyInfoSubset { } } +function parseMacrosSubset(value: string): MacrosSubset { + switch (value.toLowerCase()) { + case 'all': + return 'all'; + case 'no': + case 'none': + return 'none'; + case 'with_components': + case 'with-components': + return 'with_components'; + default: + throw new Error(`Failed to resolve macros subset from '${value}' value.`); + } +} + updateScarbProject(); diff --git a/packages/core/cairo_alpha/src/set-access-control.ts b/packages/core/cairo_alpha/src/set-access-control.ts index b912ef50a..84b076619 100644 --- a/packages/core/cairo_alpha/src/set-access-control.ts +++ b/packages/core/cairo_alpha/src/set-access-control.ts @@ -94,19 +94,23 @@ export function setAccessControl(c: ContractBuilder, access: Access): void { if (c.interfaceFlags.has('ISRC5')) { c.addImplToComponent(components.AccessControlComponent, { name: 'AccessControlImpl', + embed: true, value: 'AccessControlComponent::AccessControlImpl', }); c.addImplToComponent(components.AccessControlComponent, { name: 'AccessControlCamelImpl', + embed: true, value: 'AccessControlComponent::AccessControlCamelImpl', }); c.addImplToComponent(components.AccessControlComponent, { name: 'AccessControlWithDelayImpl', + embed: true, value: 'AccessControlComponent::AccessControlWithDelayImpl', }); } else { c.addImplToComponent(components.AccessControlComponent, { name: 'AccessControlMixinImpl', + embed: true, value: 'AccessControlComponent::AccessControlMixinImpl', }); c.addInterfaceFlag('ISRC5'); @@ -119,8 +123,8 @@ export function setAccessControl(c: ContractBuilder, access: Access): void { type: 'ContractAddress', }); - c.addUseClause('openzeppelin::access::accesscontrol', 'DEFAULT_ADMIN_ROLE'); - c.addConstructorCode('self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin)'); + c.addUseClause('openzeppelin_access::accesscontrol', 'DEFAULT_ADMIN_ROLE'); + c.addConstructorCode('self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin)'); } break; } @@ -130,23 +134,28 @@ export function setAccessControl(c: ContractBuilder, access: Access): void { if (c.interfaceFlags.has('ISRC5')) { c.addImplToComponent(components.AccessControlDefaultAdminRulesComponent, { name: 'AccessControlImpl', + embed: true, value: 'AccessControlDefaultAdminRulesComponent::AccessControlImpl', }); c.addImplToComponent(components.AccessControlDefaultAdminRulesComponent, { name: 'AccessControlDefaultAdminRulesImpl', + embed: true, value: 'AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl', }); c.addImplToComponent(components.AccessControlDefaultAdminRulesComponent, { name: 'AccessControlCamelImpl', + embed: true, value: 'AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl', }); c.addImplToComponent(components.AccessControlDefaultAdminRulesComponent, { name: 'AccessControlWithDelayImpl', + embed: true, value: 'AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl', }); } else { c.addImplToComponent(components.AccessControlDefaultAdminRulesComponent, { name: 'AccessControlMixinImpl', + embed: true, value: 'AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl', }); c.addInterfaceFlag('ISRC5'); @@ -166,7 +175,7 @@ export function setAccessControl(c: ContractBuilder, access: Access): void { 'u64', ); if (defaultAdminDelayIncreaseWait === DEFAULT_ADMIN_DELAY_INCREASE_WAIT) { - c.addUseClause('openzeppelin::access::accesscontrol::extensions', 'DefaultConfig', { + c.addUseClause('openzeppelin_access::accesscontrol::extensions', 'DefaultConfig', { alias: 'AccessControlDefaultAdminRulesDefaultConfig', }); } else { @@ -280,7 +289,7 @@ function getDefaultAdminDelayIncreaseWait(opts: RolesDefaultAdminRulesOptions): const components = defineComponents({ OwnableComponent: { - path: 'openzeppelin::access::ownable', + path: 'openzeppelin_access::ownable', substorage: { name: 'ownable', type: 'OwnableComponent::Storage', @@ -292,6 +301,7 @@ const components = defineComponents({ impls: [ { name: 'OwnableMixinImpl', + embed: true, value: 'OwnableComponent::OwnableMixinImpl', }, { @@ -302,9 +312,9 @@ const components = defineComponents({ ], }, AccessControlComponent: { - path: 'openzeppelin::access::accesscontrol', + path: 'openzeppelin_access::accesscontrol', substorage: { - name: 'accesscontrol', + name: 'access_control', type: 'AccessControlComponent::Storage', }, event: { @@ -320,9 +330,9 @@ const components = defineComponents({ ], }, AccessControlDefaultAdminRulesComponent: { - path: 'openzeppelin::access::accesscontrol::extensions', + path: 'openzeppelin_access::accesscontrol::extensions', substorage: { - name: 'accesscontrol_dar', + name: 'access_control_dar', type: 'AccessControlDefaultAdminRulesComponent::Storage', }, event: { diff --git a/packages/core/cairo_alpha/src/set-macros.ts b/packages/core/cairo_alpha/src/set-macros.ts new file mode 100644 index 000000000..67b5dcf69 --- /dev/null +++ b/packages/core/cairo_alpha/src/set-macros.ts @@ -0,0 +1,26 @@ +export type MacrosOptions = { + withComponents: boolean; +}; + +const options = { + withComponentsOFF: { withComponents: false }, + withComponentsON: { withComponents: true }, +} as const; + +export const defaults: MacrosOptions = options.withComponentsOFF; +export type MacrosSubset = 'all' | 'none' | 'with_components'; + +export function resolveMacrosOptions(subset: MacrosSubset): MacrosOptions[] { + switch (subset) { + case 'all': + return [options.withComponentsOFF, options.withComponentsON]; + case 'none': + return [options.withComponentsOFF]; + case 'with_components': + return [options.withComponentsON]; + default: { + const _: never = subset; + throw new Error('Unknown MacrosSubset'); + } + } +} diff --git a/packages/core/cairo_alpha/src/set-royalty-info.ts b/packages/core/cairo_alpha/src/set-royalty-info.ts index c6024aa8e..9a771100a 100644 --- a/packages/core/cairo_alpha/src/set-royalty-info.ts +++ b/packages/core/cairo_alpha/src/set-royalty-info.ts @@ -76,6 +76,7 @@ export function setRoyaltyInfo(c: ContractBuilder, options: RoyaltyInfoOptions, case 'ownable': { c.addImplToComponent(components.ERC2981Component, { name: 'ERC2981AdminOwnableImpl', + embed: true, value: `ERC2981Component::ERC2981AdminOwnableImpl`, }); break; @@ -83,25 +84,27 @@ export function setRoyaltyInfo(c: ContractBuilder, options: RoyaltyInfoOptions, case 'roles': { c.addImplToComponent(components.ERC2981Component, { name: 'ERC2981AdminAccessControlImpl', + embed: true, value: `ERC2981Component::ERC2981AdminAccessControlImpl`, }); c.addConstructorArgument({ name: 'royalty_admin', type: 'ContractAddress', }); - c.addConstructorCode('self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin)'); + c.addConstructorCode('self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin)'); break; } case 'roles-dar': { c.addImplToComponent(components.ERC2981Component, { name: 'ERC2981AdminAccessControlDefaultAdminRulesImpl', + embed: true, value: `ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl`, }); c.addConstructorArgument({ name: 'royalty_admin', type: 'ContractAddress', }); - c.addConstructorCode('self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin)'); + c.addConstructorCode('self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin)'); break; } default: { @@ -110,7 +113,7 @@ export function setRoyaltyInfo(c: ContractBuilder, options: RoyaltyInfoOptions, } } if (feeDenominator === DEFAULT_FEE_DENOMINATOR) { - c.addUseClause('openzeppelin::token::common::erc2981', 'DefaultConfig', { alias: 'ERC2981DefaultConfig' }); + c.addUseClause('openzeppelin_token::common::erc2981', 'DefaultConfig', { alias: 'ERC2981DefaultConfig' }); } else { const trait: BaseImplementedTrait = { name: 'ERC2981ImmutableConfig', @@ -147,7 +150,7 @@ function getRoyaltyParameters(opts: Required): { const components = defineComponents({ ERC2981Component: { - path: 'openzeppelin::token::common::erc2981', + path: 'openzeppelin_token::common::erc2981', substorage: { name: 'erc2981', type: 'ERC2981Component::Storage', @@ -159,16 +162,18 @@ const components = defineComponents({ impls: [ { name: 'ERC2981Impl', + embed: true, value: 'ERC2981Component::ERC2981Impl', }, { name: 'ERC2981InfoImpl', + embed: true, value: 'ERC2981Component::ERC2981InfoImpl', }, { name: 'ERC2981InternalImpl', - value: 'ERC2981Component::InternalImpl', embed: false, + value: 'ERC2981Component::InternalImpl', }, ], }, diff --git a/packages/core/cairo_alpha/src/set-upgradeable.ts b/packages/core/cairo_alpha/src/set-upgradeable.ts index 43566983e..9e1b8f36b 100644 --- a/packages/core/cairo_alpha/src/set-upgradeable.ts +++ b/packages/core/cairo_alpha/src/set-upgradeable.ts @@ -19,7 +19,7 @@ function setUpgradeableBase(c: ContractBuilder, upgradeable: Upgradeable): BaseI c.addComponent(components.UpgradeableComponent, [], false); - c.addUseClause('openzeppelin::interfaces::upgrades', 'IUpgradeable'); + c.addUseClause('openzeppelin_interfaces::upgrades', 'IUpgradeable'); c.addUseClause('starknet', 'ClassHash'); const t: BaseImplementedTrait = { @@ -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.addUseClause('openzeppelin::governance::governor::GovernorComponent', 'InternalExtendedImpl'); + c.addUseClause('openzeppelin_governance::governor::GovernorComponent', 'InternalExtendedImpl'); c.addFunctionCodeBefore(trait, functions.upgrade, 'self.governor.assert_only_governance()'); } } @@ -71,7 +71,7 @@ export function setAccountUpgradeable(c: ContractBuilder, upgradeable: Upgradeab const components = defineComponents({ UpgradeableComponent: { - path: 'openzeppelin::upgrades', + path: 'openzeppelin_upgrades', substorage: { name: 'upgradeable', type: 'UpgradeableComponent::Storage', diff --git a/packages/core/cairo_alpha/src/test.ts b/packages/core/cairo_alpha/src/test.ts index 7eb96152b..f160df6b7 100644 --- a/packages/core/cairo_alpha/src/test.ts +++ b/packages/core/cairo_alpha/src/test.ts @@ -8,6 +8,7 @@ import type { KindSubset } from './generate/sources'; import type { AccessSubset } from './set-access-control'; import type { RoyaltyInfoSubset } from './set-royalty-info'; import type { GenericOptions } from './build-generic'; +import type { MacrosSubset } from './set-macros'; import { generateSources, writeGeneratedSources } from './generate/sources'; import { custom, erc20, erc721, erc1155 } from './api'; @@ -54,8 +55,9 @@ async function testGenerate(params: { kind: KindSubset; access?: AccessSubset; royaltyInfo?: RoyaltyInfoSubset; + macros?: MacrosSubset; }) { - const { ctx, kind, access, royaltyInfo } = params; + const { ctx, kind, access, royaltyInfo, macros } = params; const generatedSourcesPath = path.join(os.tmpdir(), 'oz-wizard-cairo-alpha'); await fs.rm(generatedSourcesPath, { force: true, recursive: true }); await writeGeneratedSources({ @@ -65,6 +67,7 @@ async function testGenerate(params: { kind, access: access || 'all', royaltyInfo: royaltyInfo || 'all', + macros: macros || 'all', logsEnabled: false, }); @@ -101,9 +104,10 @@ test('is access control required', async t => { kind: 'all', access: 'all', royaltyInfo: 'all', + macros: 'none', }); for (const contract of allSources) { - const regexOwnable = /(use openzeppelin::access::ownable::OwnableComponent)/gm; + const regexOwnable = /(use openzeppelin_access::ownable::OwnableComponent)/gm; switch (contract.options.kind) { case 'Account': diff --git a/packages/core/cairo_alpha/src/account.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts similarity index 96% rename from packages/core/cairo_alpha/src/account.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts index cad307c75..7cf70e72e 100644 --- a/packages/core/cairo_alpha/src/account.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts @@ -1,10 +1,10 @@ import test from 'ava'; -import type { AccountOptions } from './account'; -import { buildAccount } from './account'; -import { printContract } from './print'; +import type { AccountOptions } from '../../../account'; +import { buildAccount } from '../../../account'; +import { printContract } from '../../../print'; -import { account } from '.'; +import { account } from '../../..'; function testAccount(title: string, opts: Partial) { test(title, t => { diff --git a/packages/core/cairo_alpha/src/account.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.md similarity index 89% rename from packages/core/cairo_alpha/src/account.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.md index 97bd711cd..07b77c0d5 100644 --- a/packages/core/cairo_alpha/src/account.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/account.test.ts` +# Snapshot report for `src/tests/with_components_off/account/account.test.ts` The actual snapshot is saved in `account.test.ts.snap`. @@ -13,11 +13,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -90,9 +90,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -146,11 +146,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -223,9 +223,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -279,10 +279,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -350,8 +350,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -400,11 +400,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -481,10 +481,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -554,10 +554,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -627,10 +627,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -702,10 +702,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -777,10 +777,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -854,10 +854,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::AccountComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::AccountComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: AccountComponent, storage: account, event: AccountEvent);␊ @@ -931,12 +931,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1009,10 +1009,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1066,12 +1066,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1144,10 +1144,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1201,11 +1201,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1273,9 +1273,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -1324,12 +1324,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::account::extensions::SRC9Component;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_account::extensions::SRC9Component;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1406,11 +1406,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1480,11 +1480,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1554,11 +1554,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1630,11 +1630,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1706,11 +1706,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ @@ -1784,11 +1784,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract(account)]␊ mod MyAccount {␊ - use openzeppelin::account::eth_account::EthAccountComponent;␊ - use openzeppelin::interfaces::accounts::EthPublicKey;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_account::eth_account::EthAccountComponent;␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::ClassHash;␊ ␊ component!(path: EthAccountComponent, storage: eth_account, event: EthAccountEvent);␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.snap new file mode 100644 index 000000000..5f1edcea0 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/account/account.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/contract.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts similarity index 75% rename from packages/core/cairo_alpha/src/contract.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts index 8719121ca..6d7b56258 100644 --- a/packages/core/cairo_alpha/src/contract.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts @@ -1,9 +1,10 @@ import test from 'ava'; -import type { BaseFunction, BaseImplementedTrait, Component } from './contract'; -import { ContractBuilder } from './contract'; -import { printContract } from './print'; -import { SECURITY_CONTACT_DOCUMENTATION } from './set-info'; +import type { BaseFunction, BaseImplementedTrait, Component } from '../../../contract'; +import type { MacrosOptions } from '../../../set-macros'; +import { ContractBuilder } from '../../../contract'; +import { printContract } from '../../../print'; +import { SECURITY_CONTACT_DOCUMENTATION } from '../../../set-info'; const FOO_COMPONENT: Component = { name: 'FooComponent', @@ -19,6 +20,7 @@ const FOO_COMPONENT: Component = { impls: [ { name: 'FooImpl', + embed: true, value: 'FooComponent::FooImpl', }, { @@ -29,25 +31,29 @@ const FOO_COMPONENT: Component = { ], }; +const disabledMacros: MacrosOptions = { + withComponents: false, +}; + test('contract basics', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); t.snapshot(printContract(Foo)); }); test('contract with constructor code', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addConstructorCode('someFunction()'); t.snapshot(printContract(Foo)); }); test('contract with constructor code with semicolon', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addConstructorCode('someFunction();'); t.snapshot(printContract(Foo)); }); test('contract with function code before', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); const trait: BaseImplementedTrait = { name: 'External', of: 'ExternalTrait', @@ -66,7 +72,7 @@ test('contract with function code before', t => { }); test('contract with function code before with semicolons', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); const trait: BaseImplementedTrait = { name: 'External', of: 'ExternalTrait', @@ -85,21 +91,21 @@ test('contract with function code before with semicolons', t => { }); test('contract with initializer params', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addComponent(FOO_COMPONENT, ['param1'], true); t.snapshot(printContract(Foo)); }); test('contract with standalone import', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addComponent(FOO_COMPONENT); Foo.addUseClause('some::library', 'SomeLibrary'); t.snapshot(printContract(Foo)); }); test('contract with sorted use clauses', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addComponent(FOO_COMPONENT); Foo.addUseClause('some::library', 'SomeLibrary'); Foo.addUseClause('another::library', 'AnotherLibrary'); @@ -109,7 +115,7 @@ test('contract with sorted use clauses', t => { }); test('contract with info', t => { - const Foo = new ContractBuilder('Foo'); + const Foo = new ContractBuilder('Foo', disabledMacros); Foo.addDocumentation(`${SECURITY_CONTACT_DOCUMENTATION}security@example.com`); t.snapshot(printContract(Foo)); }); diff --git a/packages/core/cairo_alpha/src/contract.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.md similarity index 95% rename from packages/core/cairo_alpha/src/contract.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.md index 06577f4ce..5c6296b3a 100644 --- a/packages/core/cairo_alpha/src/contract.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/contract.test.ts` +# Snapshot report for `src/tests/with_components_off/contract/contract.test.ts` The actual snapshot is saved in `contract.test.ts.snap`. @@ -14,8 +14,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ }␊ ` @@ -29,8 +28,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ @@ -49,8 +47,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ @@ -69,8 +66,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ @@ -94,8 +90,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ @@ -243,7 +238,6 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod Foo {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ }␊ ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.snap new file mode 100644 index 000000000..fd5bd0b16 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/contract/contract.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/custom.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts similarity index 87% rename from packages/core/cairo_alpha/src/custom.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts index 81037f5b0..f995424e6 100644 --- a/packages/core/cairo_alpha/src/custom.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts @@ -1,10 +1,10 @@ import test from 'ava'; -import { custom } from '.'; +import { custom } from '../../..'; -import type { CustomOptions } from './custom'; -import { buildCustom } from './custom'; -import { printContract } from './print'; -import { AccessControl, darDefaultOpts, darCustomOpts } from './set-access-control'; +import type { CustomOptions } from '../../../custom'; +import { buildCustom } from '../../../custom'; +import { printContract } from '../../../print'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; function testCustom(title: string, opts: Partial) { test(title, t => { diff --git a/packages/core/cairo_alpha/src/custom.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.md similarity index 85% rename from packages/core/cairo_alpha/src/custom.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.md index c9f9ea133..771a98d13 100644 --- a/packages/core/cairo_alpha/src/custom.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/custom.test.ts` +# Snapshot report for `src/tests/with_components_off/custom/custom.test.ts` The actual snapshot is saved in `custom.test.ts.snap`. @@ -14,8 +14,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyContract {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ }␊ ` @@ -28,9 +27,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ @@ -89,10 +88,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ @@ -175,9 +174,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ @@ -237,8 +236,7 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyContract {␊ #[storage]␊ - struct Storage {␊ - }␊ + struct Storage {}␊ }␊ ` @@ -251,9 +249,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ @@ -314,14 +312,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -336,7 +334,7 @@ Generated by [AVA](https://avajs.dev). #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -360,10 +358,10 @@ Generated by [AVA](https://avajs.dev). default_admin: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ //␊ @@ -373,7 +371,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -391,19 +389,19 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ const INITIAL_DELAY: u64 = 86400; // 1 day␊ ␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -418,7 +416,7 @@ Generated by [AVA](https://avajs.dev). #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -442,9 +440,9 @@ Generated by [AVA](https://avajs.dev). initial_default_admin: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ //␊ @@ -454,7 +452,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -472,16 +470,16 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ const INITIAL_DELAY: u64 = 172800; // 2 days␊ ␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -496,7 +494,7 @@ Generated by [AVA](https://avajs.dev). #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -520,9 +518,9 @@ Generated by [AVA](https://avajs.dev). initial_default_admin: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -536,7 +534,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -552,8 +550,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyContract {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::security::pausable::PausableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_security::pausable::PausableComponent;␊ use starknet::ContractAddress;␊ ␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.snap new file mode 100644 index 000000000..86bf26d2e Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/custom/custom.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/erc1155.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts similarity index 93% rename from packages/core/cairo_alpha/src/erc1155.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts index 96fac1703..3de1744c7 100644 --- a/packages/core/cairo_alpha/src/erc1155.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts @@ -1,11 +1,11 @@ import test from 'ava'; -import { erc1155 } from '.'; +import { erc1155 } from '../../..'; -import type { ERC1155Options } from './erc1155'; -import { buildERC1155 } from './erc1155'; -import { printContract } from './print'; -import { royaltyInfoOptions } from './set-royalty-info'; -import { AccessControl, darDefaultOpts, darCustomOpts } from './set-access-control'; +import type { ERC1155Options } from '../../../erc1155'; +import { buildERC1155 } from '../../../erc1155'; +import { printContract } from '../../../print'; +import { royaltyInfoOptions } from '../../../set-royalty-info'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; const NAME = 'MyToken'; const CUSTOM_NAME = 'CustomToken'; diff --git a/packages/core/cairo_alpha/src/erc1155.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.md similarity index 85% rename from packages/core/cairo_alpha/src/erc1155.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.md index edb0a57e8..ce525fd58 100644 --- a/packages/core/cairo_alpha/src/erc1155.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/erc1155.test.ts` +# Snapshot report for `src/tests/with_components_off/erc1155/erc1155.test.ts` The actual snapshot is saved in `erc1155.test.ts.snap`. @@ -13,9 +13,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use starknet::ContractAddress;␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -85,11 +85,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -180,17 +180,17 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + 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: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -215,7 +215,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -241,11 +241,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -253,7 +253,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -270,7 +270,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -286,11 +286,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -363,11 +363,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -488,12 +488,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -614,11 +614,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -745,17 +745,17 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + 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: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -780,7 +780,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -807,12 +807,12 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -826,7 +826,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -838,7 +838,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -855,7 +855,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -872,7 +872,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -892,14 +892,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -907,7 +907,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -934,7 +934,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -961,11 +961,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -979,7 +979,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -991,7 +991,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -1008,7 +1008,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -1025,7 +1025,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1045,11 +1045,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -1057,7 +1057,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -1084,7 +1084,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -1111,11 +1111,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -1133,7 +1133,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -1145,7 +1145,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -1162,7 +1162,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -1179,7 +1179,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1195,11 +1195,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -1287,14 +1287,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -1402,20 +1402,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + 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: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1448,7 +1448,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1480,13 +1480,13 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ #[generate_trait]␊ @@ -1494,7 +1494,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -1511,7 +1511,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1530,14 +1530,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -1545,7 +1545,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1580,7 +1580,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1612,12 +1612,12 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -1629,7 +1629,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -1646,7 +1646,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1662,12 +1662,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ @@ -1779,18 +1779,18 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + 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: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1823,7 +1823,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1855,13 +1855,13 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ @@ -1873,7 +1873,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -1890,7 +1890,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1909,15 +1909,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -1925,7 +1925,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1960,7 +1960,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1992,12 +1992,12 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ @@ -2009,7 +2009,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -2026,7 +2026,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2045,12 +2045,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -2058,7 +2058,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -2093,7 +2093,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -2125,12 +2125,12 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -2146,7 +2146,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -2163,7 +2163,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2183,20 +2183,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ 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);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ @@ -2232,7 +2232,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ @@ -2263,14 +2263,14 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -2291,13 +2291,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2342,7 +2342,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -2354,7 +2354,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -2371,7 +2371,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -2397,22 +2397,22 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ + 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);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -2450,7 +2450,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -2486,15 +2486,15 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -2515,13 +2515,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2566,7 +2566,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -2578,7 +2578,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -2595,7 +2595,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -2612,7 +2612,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2632,16 +2632,16 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ use starknet::{ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -2650,7 +2650,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ @@ -2688,7 +2688,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ @@ -2719,13 +2719,13 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -2746,13 +2746,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2797,7 +2797,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -2809,7 +2809,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -2826,7 +2826,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -2851,13 +2851,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ use starknet::{ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -2866,7 +2866,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ @@ -2904,7 +2904,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ @@ -2935,13 +2935,13 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -2966,13 +2966,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -3017,7 +3017,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -3029,7 +3029,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -3046,7 +3046,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -3072,18 +3072,18 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -3092,7 +3092,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -3132,7 +3132,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -3168,14 +3168,14 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -3196,13 +3196,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -3247,7 +3247,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -3259,7 +3259,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -3276,7 +3276,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -3293,7 +3293,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -3314,15 +3314,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc1155::ERC1155Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc1155::ERC1155Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ @@ -3331,7 +3331,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -3371,7 +3371,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -3407,14 +3407,14 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ @@ -3439,13 +3439,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -3490,7 +3490,7 @@ Generated by [AVA](https://avajs.dev). value: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ @@ -3502,7 +3502,7 @@ Generated by [AVA](https://avajs.dev). values: Span,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ @@ -3519,7 +3519,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ - self.accesscontrol_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ @@ -3536,7 +3536,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.snap new file mode 100644 index 000000000..5a1f57c3d Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/erc1155/erc1155.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/erc20.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts similarity index 94% rename from packages/core/cairo_alpha/src/erc20.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts index b7f224ba5..c5d13c4dd 100644 --- a/packages/core/cairo_alpha/src/erc20.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts @@ -1,12 +1,12 @@ import test from 'ava'; -import type { ERC20Options } from './erc20'; -import { buildERC20, getInitialSupply } from './erc20'; -import { printContract } from './print'; -import { AccessControl, darDefaultOpts, darCustomOpts } from './set-access-control'; +import type { ERC20Options } from '../../../erc20'; +import { buildERC20, getInitialSupply } from '../../../erc20'; +import { printContract } from '../../../print'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; -import type { OptionsError } from '.'; -import { erc20 } from '.'; +import type { OptionsError } from '../../..'; +import { erc20 } from '../../..'; function testERC20(title: string, opts: Partial) { test(title, t => { diff --git a/packages/core/cairo_alpha/src/erc20.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.md similarity index 85% rename from packages/core/cairo_alpha/src/erc20.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.md index 389b9f184..b36fa5802 100644 --- a/packages/core/cairo_alpha/src/erc20.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/erc20.test.ts` +# Snapshot report for `src/tests/with_components_off/erc20/erc20.test.ts` The actual snapshot is saved in `erc20.test.ts.snap`. @@ -13,7 +13,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ ␊ @@ -55,12 +55,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -128,12 +128,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -210,11 +210,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -321,18 +321,18 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -357,7 +357,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -387,11 +387,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -411,13 +411,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ }␊ @@ -429,7 +429,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -448,15 +448,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -464,7 +464,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -489,7 +489,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -519,10 +519,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -542,13 +542,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ }␊ @@ -560,7 +560,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -579,12 +579,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -592,7 +592,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -617,7 +617,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -647,10 +647,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -674,13 +674,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ }␊ @@ -692,7 +692,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -708,11 +708,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -821,12 +821,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -896,12 +896,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -969,10 +969,10 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1044,12 +1044,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1130,18 +1130,18 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -1161,7 +1161,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ erc20: ERC20Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -1189,11 +1189,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -1201,7 +1201,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -1213,7 +1213,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1232,23 +1232,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ const INITIAL_DELAY: u64 = 86400; // 1 day␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -1268,7 +1268,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ erc20: ERC20Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -1296,10 +1296,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -1307,7 +1307,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -1319,7 +1319,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1338,20 +1338,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc20::{␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc20::{␊ DefaultConfig as ERC20DefaultConfig, ERC20Component, ERC20HooksEmptyImpl␊ };␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ const INITIAL_DELAY: u64 = 172800; // 2 days␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ @@ -1371,7 +1371,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ erc20: ERC20Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -1399,10 +1399,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -1414,7 +1414,7 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -1426,7 +1426,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1442,14 +1442,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1558,14 +1558,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1674,11 +1674,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::ContractAddress;␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1760,13 +1760,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -1904,15 +1904,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ @@ -2072,22 +2072,22 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ 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);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ @@ -2119,7 +2119,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -2159,13 +2159,13 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ self.erc20.mint(recipient, 2000000000000000000000);␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -2195,13 +2195,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2212,7 +2212,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -2238,7 +2238,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2258,19 +2258,19 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -2278,7 +2278,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ @@ -2310,7 +2310,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -2350,12 +2350,12 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ self.erc20.mint(recipient, 2000000000000000000000);␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -2385,13 +2385,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2402,7 +2402,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -2428,7 +2428,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2448,16 +2448,16 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20Component};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -2465,7 +2465,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: NoncesComponent, storage: nonces, event: NoncesEvent);␊ component!(path: VotesComponent, storage: votes, event: VotesEvent);␊ @@ -2497,7 +2497,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ @@ -2537,12 +2537,12 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc20.initializer("MyToken", "MTK");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ self.erc20.mint(recipient, 2000000000000000000000);␊ - self.accesscontrol_dar._grant_role(PAUSER_ROLE, pauser);␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ @@ -2576,13 +2576,13 @@ Generated by [AVA](https://avajs.dev). impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ - self.accesscontrol_dar.assert_only_role(PAUSER_ROLE);␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ @@ -2593,7 +2593,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc20.mint(recipient, amount);␊ }␊ }␊ @@ -2619,7 +2619,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.snap new file mode 100644 index 000000000..b4c68c803 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/erc20/erc20.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/erc721.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts similarity index 93% rename from packages/core/cairo_alpha/src/erc721.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts index bfd04c49a..9976a6699 100644 --- a/packages/core/cairo_alpha/src/erc721.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts @@ -1,13 +1,13 @@ import test from 'ava'; -import type { ERC721Options } from './erc721'; -import { buildERC721 } from './erc721'; -import { printContract } from './print'; -import { royaltyInfoOptions } from './set-royalty-info'; -import { AccessControl, darDefaultOpts, darCustomOpts } from './set-access-control'; - -import type { OptionsError } from '.'; -import { erc721 } from '.'; +import type { ERC721Options } from '../../../erc721'; +import { buildERC721 } from '../../../erc721'; +import { printContract } from '../../../print'; +import { royaltyInfoOptions } from '../../../set-royalty-info'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; + +import type { OptionsError } from '../../..'; +import { erc721 } from '../../..'; const NAME = 'MyToken'; const CUSTOM_NAME = 'CustomToken'; diff --git a/packages/core/cairo_alpha/src/erc721.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.md similarity index 86% rename from packages/core/cairo_alpha/src/erc721.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.md index 1ab18758a..e03618bb2 100644 --- a/packages/core/cairo_alpha/src/erc721.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/erc721.test.ts` +# Snapshot report for `src/tests/with_components_off/erc721/erc721.test.ts` The actual snapshot is saved in `erc721.test.ts.snap`. @@ -13,8 +13,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ @@ -59,11 +59,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -136,11 +136,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -214,11 +214,11 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use core::num::traits::Zero;␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -300,12 +300,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -414,11 +414,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -516,12 +516,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -615,13 +615,13 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -743,17 +743,17 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -778,7 +778,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -804,11 +804,11 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -821,7 +821,7 @@ Generated by [AVA](https://avajs.dev). token_id: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol.assert_only_role(MINTER_ROLE);␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ self.erc721.safe_mint(recipient, token_id, data);␊ }␊ ␊ @@ -843,7 +843,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -862,14 +862,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -877,7 +877,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -904,7 +904,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -930,10 +930,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ @@ -946,7 +946,7 @@ Generated by [AVA](https://avajs.dev). token_id: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc721.safe_mint(recipient, token_id, data);␊ }␊ ␊ @@ -968,7 +968,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -987,11 +987,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE};␊ ␊ @@ -999,7 +999,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ @@ -1026,7 +1026,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ @@ -1052,10 +1052,10 @@ Generated by [AVA](https://avajs.dev). upgrader: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ ␊ - self.accesscontrol_dar._grant_role(MINTER_ROLE, minter);␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -1072,7 +1072,7 @@ Generated by [AVA](https://avajs.dev). token_id: u256,␊ data: Span,␊ ) {␊ - self.accesscontrol_dar.assert_only_role(MINTER_ROLE);␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ self.erc721.safe_mint(recipient, token_id, data);␊ }␊ ␊ @@ -1094,7 +1094,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1110,11 +1110,11 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -1187,14 +1187,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -1286,20 +1286,20 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1332,7 +1332,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1363,12 +1363,12 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ //␊ @@ -1378,7 +1378,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1396,17 +1396,17 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ @@ -1414,7 +1414,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1449,7 +1449,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1480,11 +1480,11 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ //␊ @@ -1494,7 +1494,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1512,14 +1512,14 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ @@ -1527,7 +1527,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1562,7 +1562,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1593,11 +1593,11 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -1611,7 +1611,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1627,12 +1627,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -1728,18 +1728,18 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ + component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1772,7 +1772,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol: AccessControlComponent::Storage,␊ + access_control: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1803,12 +1803,12 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol.initializer();␊ + self.access_control.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ - self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ @@ -1822,7 +1822,7 @@ 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.access_control.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1840,15 +1840,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::{␊ + use openzeppelin_access::accesscontrol::extensions::{␊ AccessControlDefaultAdminRulesComponent,␊ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊ };␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ @@ -1856,7 +1856,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -1891,7 +1891,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -1922,11 +1922,11 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ @@ -1940,7 +1940,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -1958,12 +1958,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::common::erc2981::ERC2981Component;␊ - use openzeppelin::token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::common::erc2981::ERC2981Component;␊ + use openzeppelin_token::erc721::{ERC721Component, ERC721HooksEmptyImpl};␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::UPGRADER_ROLE;␊ ␊ @@ -1971,7 +1971,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊ + component!(path: AccessControlDefaultAdminRulesComponent, storage: access_control_dar, event: AccessControlDefaultAdminRulesEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ @@ -2006,7 +2006,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ + access_control_dar: AccessControlDefaultAdminRulesComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ @@ -2037,11 +2037,11 @@ Generated by [AVA](https://avajs.dev). royalty_admin: ContractAddress,␊ ) {␊ self.erc721.initializer("MyToken", "MTK", "");␊ - self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ - self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊ - self.accesscontrol_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ @@ -2059,7 +2059,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ - self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ @@ -2076,18 +2076,18 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use core::num::traits::Zero;␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -2262,15 +2262,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -2385,15 +2385,15 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -2508,12 +2508,12 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyToken {␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::ContractAddress;␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ @@ -2602,20 +2602,20 @@ Generated by [AVA](https://avajs.dev). #[starknet::contract]␊ mod MyToken {␊ use core::num::traits::Zero;␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::governance::votes::VotesComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::security::pausable::PausableComponent;␊ - use openzeppelin::token::common::erc2981::{␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_governance::votes::VotesComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_security::pausable::PausableComponent;␊ + use openzeppelin_token::common::erc2981::{␊ DefaultConfig as ERC2981DefaultConfig, ERC2981Component␊ };␊ - use openzeppelin::token::erc721::ERC721Component;␊ - use openzeppelin::token::erc721::extensions::ERC721EnumerableComponent;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::contract_clock::ERC6372TimestampClock;␊ - use openzeppelin::utils::cryptography::nonces::NoncesComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_token::erc721::ERC721Component;␊ + use openzeppelin_token::erc721::extensions::ERC721EnumerableComponent;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::nonces::NoncesComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.snap new file mode 100644 index 000000000..6da21e45a Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/erc721/erc721.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/governor.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts similarity index 94% rename from packages/core/cairo_alpha/src/governor.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts index 0f102c18f..747f2f5b1 100644 --- a/packages/core/cairo_alpha/src/governor.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts @@ -1,9 +1,9 @@ import test from 'ava'; -import { governor } from '.'; +import { governor } from '../../..'; -import type { GovernorOptions } from './governor'; -import { buildGovernor } from './governor'; -import { printContract } from './print'; +import type { GovernorOptions } from '../../../governor'; +import { buildGovernor } from '../../../governor'; +import { printContract } from '../../../print'; const NAME = 'MyGovernor'; diff --git a/packages/core/cairo_alpha/src/governor.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.md similarity index 81% rename from packages/core/cairo_alpha/src/governor.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.md index 46f2acb65..1691985b2 100644 --- a/packages/core/cairo_alpha/src/governor.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/governor.test.ts` +# Snapshot report for `src/tests/with_components_off/governor/governor.test.ts` The actual snapshot is saved in `governor.test.ts.snap`. @@ -13,23 +13,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -39,8 +39,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -78,9 +78,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -115,7 +115,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -157,19 +157,19 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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 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%␊ @@ -179,8 +179,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, event: GovernorVotesEvent);␊ component!(path: GovernorSettingsComponent, storage: governor_settings, event: GovernorSettingsEvent);␊ component!(path: GovernorTimelockExecutionComponent, storage: governor_timelock_execution, event: GovernorTimelockExecutionEvent);␊ ␊ @@ -214,9 +214,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -247,7 +247,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -277,23 +277,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -303,8 +303,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -342,9 +342,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -379,7 +379,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -421,23 +421,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -447,8 +447,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -486,9 +486,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -523,7 +523,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -565,23 +565,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod CustomGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -591,8 +591,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -630,9 +630,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -667,7 +667,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -709,23 +709,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -735,8 +735,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -774,9 +774,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -811,7 +811,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -853,23 +853,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM: u256 = 200000000000000000000; // 200 * pow!(10, 18)␊ @@ -879,7 +879,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting_simple, 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);␊ @@ -917,7 +917,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ governor_votes: GovernorVotesComponent::Storage,␊ #[substorage(v0)]␊ @@ -1006,23 +1006,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 400; // 40%␊ @@ -1032,8 +1032,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -1071,9 +1071,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -1108,7 +1108,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -1150,23 +1150,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM_NUMERATOR: u256 = 40; // 4%␊ @@ -1176,8 +1176,8 @@ Generated by [AVA](https://avajs.dev). ␊ 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: GovernorCountingSimpleComponent, storage: governor_counting_simple, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorVotesQuorumFractionComponent, storage: governor_votes_quorum_fraction, 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);␊ @@ -1215,9 +1215,9 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ - governor_votes: GovernorVotesQuorumFractionComponent::Storage,␊ + governor_votes_quorum_fraction: GovernorVotesQuorumFractionComponent::Storage,␊ #[substorage(v0)]␊ governor_settings: GovernorSettingsComponent::Storage,␊ #[substorage(v0)]␊ @@ -1252,7 +1252,7 @@ Generated by [AVA](https://avajs.dev). timelock_controller: ContractAddress,␊ ) {␊ self.governor.initializer();␊ - self.governor_votes.initializer(votes_token, QUORUM_NUMERATOR);␊ + self.governor_votes_quorum_fraction.initializer(votes_token, QUORUM_NUMERATOR);␊ self.governor_settings.initializer(VOTING_DELAY, VOTING_PERIOD, PROPOSAL_THRESHOLD);␊ self.governor_timelock_execution.initializer(timelock_controller);␊ }␊ @@ -1294,23 +1294,23 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyGovernor {␊ - use openzeppelin::governance::governor::{␊ + use openzeppelin_governance::governor::{␊ DefaultConfig as GovernorDefaultConfig, GovernorComponent␊ };␊ - use openzeppelin::governance::governor::extensions::{␊ + 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::{␊ + 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::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::introspection::src5::SRC5Component;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ - use openzeppelin::utils::cryptography::snip12::SNIP12Metadata;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_introspection::src5::SRC5Component;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const QUORUM: u256 = 200;␊ @@ -1320,7 +1320,7 @@ Generated by [AVA](https://avajs.dev). ␊ component!(path: GovernorComponent, storage: governor, event: GovernorEvent);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ - component!(path: GovernorCountingSimpleComponent, storage: governor_counting, event: GovernorCountingSimpleEvent);␊ + component!(path: GovernorCountingSimpleComponent, storage: governor_counting_simple, 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);␊ @@ -1358,7 +1358,7 @@ Generated by [AVA](https://avajs.dev). #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ - governor_counting: GovernorCountingSimpleComponent::Storage,␊ + governor_counting_simple: GovernorCountingSimpleComponent::Storage,␊ #[substorage(v0)]␊ governor_votes: GovernorVotesComponent::Storage,␊ #[substorage(v0)]␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.snap new file mode 100644 index 000000000..1cb9178b3 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/governor/governor.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/multisig.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts similarity index 86% rename from packages/core/cairo_alpha/src/multisig.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts index ea670a924..252913275 100644 --- a/packages/core/cairo_alpha/src/multisig.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts @@ -1,10 +1,10 @@ import test from 'ava'; -import type { OptionsError } from '.'; -import { multisig } from '.'; -import type { MultisigOptions } from './multisig'; -import { buildMultisig } from './multisig'; -import { contractDefaults as commonDefaults } from './common-options'; -import { printContract } from './print'; +import type { OptionsError } from '../../..'; +import { multisig } from '../../..'; +import type { MultisigOptions } from '../../../multisig'; +import { buildMultisig } from '../../../multisig'; +import { contractDefaults as commonDefaults } from '../../../common-options'; +import { printContract } from '../../../print'; const defaults: MultisigOptions = { name: 'MyMultisig', diff --git a/packages/core/cairo_alpha/src/multisig.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.md similarity index 90% rename from packages/core/cairo_alpha/src/multisig.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.md index 01586b89d..68400daf7 100644 --- a/packages/core/cairo_alpha/src/multisig.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/multisig.test.ts` +# Snapshot report for `src/tests/with_components_off/multisig/multisig.test.ts` The actual snapshot is saved in `multisig.test.ts.snap`. @@ -13,9 +13,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod CustomMultisig {␊ - use openzeppelin::governance::multisig::MultisigComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_governance::multisig::MultisigComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const INITIAL_QUORUM: u32 = 2;␊ @@ -76,9 +76,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyMultisig {␊ - use openzeppelin::governance::multisig::MultisigComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_governance::multisig::MultisigComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const INITIAL_QUORUM: u32 = 42;␊ @@ -139,9 +139,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod CustomMultisig {␊ - use openzeppelin::governance::multisig::MultisigComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_governance::multisig::MultisigComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const INITIAL_QUORUM: u32 = 42;␊ @@ -202,9 +202,9 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyMultisig {␊ - use openzeppelin::governance::multisig::MultisigComponent;␊ - use openzeppelin::interfaces::upgrades::IUpgradeable;␊ - use openzeppelin::upgrades::UpgradeableComponent;␊ + use openzeppelin_governance::multisig::MultisigComponent;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ const INITIAL_QUORUM: u32 = 2;␊ @@ -265,7 +265,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyMultisig {␊ - use openzeppelin::governance::multisig::MultisigComponent;␊ + use openzeppelin_governance::multisig::MultisigComponent;␊ use starknet::ContractAddress;␊ ␊ const INITIAL_QUORUM: u32 = 2;␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.snap new file mode 100644 index 000000000..0fd32278f Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/multisig/multisig.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/vesting.test.ts b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts similarity index 90% rename from packages/core/cairo_alpha/src/vesting.test.ts rename to packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts index 76139b28b..233e0dac4 100644 --- a/packages/core/cairo_alpha/src/vesting.test.ts +++ b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts @@ -1,9 +1,9 @@ import test from 'ava'; -import type { OptionsError } from '.'; -import { vesting } from '.'; -import type { VestingOptions } from './vesting'; -import { buildVesting } from './vesting'; -import { printContract } from './print'; +import type { OptionsError } from '../../..'; +import { vesting } from '../../..'; +import type { VestingOptions } from '../../../vesting'; +import { buildVesting } from '../../../vesting'; +import { printContract } from '../../../print'; const defaults: VestingOptions = { name: 'MyVesting', diff --git a/packages/core/cairo_alpha/src/vesting.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.md similarity index 92% rename from packages/core/cairo_alpha/src/vesting.test.ts.md rename to packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.md index 913ae130e..dabd6b436 100644 --- a/packages/core/cairo_alpha/src/vesting.test.ts.md +++ b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.md @@ -1,4 +1,4 @@ -# Snapshot report for `src/vesting.test.ts` +# Snapshot report for `src/tests/with_components_off/vesting/vesting.test.ts` The actual snapshot is saved in `vesting.test.ts.snap`. @@ -13,8 +13,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod CustomVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::{LinearVestingSchedule, VestingComponent};␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::{LinearVestingSchedule, VestingComponent};␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 0;␊ @@ -68,8 +68,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::{LinearVestingSchedule, VestingComponent};␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::{LinearVestingSchedule, VestingComponent};␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 1735689540; // 31 Dec 2024, 23:59 (UTC)␊ @@ -123,8 +123,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::{LinearVestingSchedule, VestingComponent};␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::{LinearVestingSchedule, VestingComponent};␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 0;␊ @@ -178,8 +178,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::{LinearVestingSchedule, VestingComponent};␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::{LinearVestingSchedule, VestingComponent};␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 0;␊ @@ -233,8 +233,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::VestingComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::VestingComponent;␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 0;␊ @@ -303,8 +303,8 @@ Generated by [AVA](https://avajs.dev). ␊ #[starknet::contract]␊ mod MyVesting {␊ - use openzeppelin::access::ownable::OwnableComponent;␊ - use openzeppelin::finance::vesting::VestingComponent;␊ + use openzeppelin_access::ownable::OwnableComponent;␊ + use openzeppelin_finance::vesting::VestingComponent;␊ use starknet::ContractAddress;␊ ␊ const START: u64 = 1735689540; // 31 Dec 2024, 23:59 (UTC)␊ diff --git a/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.snap new file mode 100644 index 000000000..baf1ade79 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_off/vesting/vesting.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts new file mode 100644 index 000000000..918037df3 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts @@ -0,0 +1,241 @@ +import test from 'ava'; + +import type { AccountOptions } from '../../../account'; +import { buildAccount, defaults } from '../../../account'; +import { printContract } from '../../../print'; + +import { account } from '../../..'; + +const withComponentsMacroON = { withComponents: true }; + +function testAccount(title: string, opts: Partial) { + test(title, t => { + const c = buildAccount({ + name: 'MyAccount', + type: 'stark', + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +function testEthAccount(title: string, opts: Partial) { + test(title, t => { + const c = buildAccount({ + name: 'MyAccount', + type: 'eth', + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: AccountOptions) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is( + account.print(options), + printContract( + buildAccount({ + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + ...options, + }), + ), + ); + }); +} + +testAccount('default full account, mixin + upgradeable', {}); + +testAccount('default full account, mixin + non-upgradeable', { + upgradeable: false, +}); + +testAccount('explicit full account, mixin + upgradeable', { + name: 'MyAccount', + type: 'stark', + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + upgradeable: true, +}); + +testAccount('explicit full account, mixin + non-upgradeable', { + name: 'MyAccount', + type: 'stark', + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + upgradeable: false, +}); + +testAccount('basic account, upgradeable', { + declare: false, + deploy: false, + pubkey: false, + outsideExecution: false, +}); + +testAccount('basic account, non-upgradeable', { + declare: false, + deploy: false, + pubkey: false, + outsideExecution: false, + upgradeable: false, +}); + +testAccount('account outside execution', { + deploy: false, + pubkey: false, + declare: false, +}); + +testAccount('account declarer', { + deploy: false, + pubkey: false, + outsideExecution: false, +}); + +testAccount('account deployable', { + declare: false, + pubkey: false, + outsideExecution: false, +}); + +testAccount('account public key', { + declare: false, + deploy: false, + outsideExecution: false, +}); + +testAccount('account declarer, deployable', { + pubkey: false, + outsideExecution: false, +}); + +testAccount('account declarer, public key', { + deploy: false, + outsideExecution: false, +}); + +testAccount('account deployable, public key', { + declare: false, + outsideExecution: false, +}); + +testEthAccount('default full ethAccount, mixin + upgradeable', {}); + +testEthAccount('default full ethAccount, mixin + non-upgradeable', { + upgradeable: false, +}); + +testEthAccount('explicit full ethAccount, mixin + upgradeable', { + name: 'MyAccount', + type: 'eth', + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + upgradeable: true, +}); + +testEthAccount('explicit full ethAccount, mixin + non-upgradeable', { + name: 'MyAccount', + type: 'eth', + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + upgradeable: false, +}); + +testEthAccount('basic ethAccount, upgradeable', { + declare: false, + deploy: false, + pubkey: false, + outsideExecution: false, +}); + +testEthAccount('basic ethAccount, non-upgradeable', { + declare: false, + deploy: false, + pubkey: false, + outsideExecution: false, + upgradeable: false, +}); + +testEthAccount('ethAccount outside execution', { + deploy: false, + pubkey: false, + declare: false, +}); + +testEthAccount('ethAccount declarer', { + deploy: false, + pubkey: false, + outsideExecution: false, +}); + +testEthAccount('ethAccount deployable', { + declare: false, + pubkey: false, + outsideExecution: false, +}); + +testEthAccount('ethAccount public key', { + declare: false, + deploy: false, + outsideExecution: false, +}); + +testEthAccount('ethAccount declarer, deployable', { + pubkey: false, + outsideExecution: false, +}); + +testEthAccount('ethAccount declarer, public key', { + deploy: false, + outsideExecution: false, +}); + +testEthAccount('ethAccount deployable, public key', { + declare: false, + outsideExecution: false, +}); + +testAPIEquivalence('account API default'); + +testAPIEquivalence('account API basic', { + name: 'CustomAccount', + type: 'stark', + declare: false, + deploy: false, + pubkey: false, + outsideExecution: false, + upgradeable: false, +}); + +testAPIEquivalence('account API full upgradeable', { + name: 'CustomAccount', + type: 'stark', + declare: true, + deploy: true, + pubkey: true, + outsideExecution: true, + upgradeable: true, +}); + +test('account API assert defaults', async t => { + t.is(account.print(account.defaults), account.print()); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.md new file mode 100644 index 000000000..61f1895a7 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.md @@ -0,0 +1,1095 @@ +# Snapshot report for `src/tests/with_components_on/account/account.test.ts` + +The actual snapshot is saved in `account.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## default full account, mixin + upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## default full account, mixin + non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, SRC9)]␊ + mod MyAccount {␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + }␊ + ` + +## explicit full account, mixin + upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## explicit full account, mixin + non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, SRC9)]␊ + mod MyAccount {␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccountMixinImpl = AccountComponent::AccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + }␊ + ` + +## basic account, upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## basic account, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5)]␊ + mod MyAccount {␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + }␊ + ` + +## account outside execution + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account declarer + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = AccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account deployable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = AccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = AccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = AccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account declarer, deployable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = AccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = AccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account declarer, public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = AccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = AccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = AccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## account deployable, public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(Account, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = AccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = AccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = AccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = AccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = AccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: felt252) {␊ + self.account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## default full ethAccount, mixin + upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## default full ethAccount, mixin + non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, SRC9)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + }␊ + ` + +## explicit full ethAccount, mixin + upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## explicit full ethAccount, mixin + non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, SRC9)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl EthAccountMixinImpl = EthAccountComponent::EthAccountMixinImpl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + }␊ + ` + +## basic ethAccount, upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## basic ethAccount, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + }␊ + ` + +## ethAccount outside execution + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, SRC9, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + #[abi(embed_v0)]␊ + impl OutsideExecutionV2Impl = SRC9Component::OutsideExecutionV2Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + self.src9.initializer();␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount declarer + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = EthAccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount deployable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = EthAccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = EthAccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount declarer, deployable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = EthAccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = EthAccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount declarer, public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeclarerImpl = EthAccountComponent::DeclarerImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = EthAccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## ethAccount deployable, public key + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract(account)]␊ + #[with_components(EthAccount, SRC5, Upgradeable)]␊ + mod MyAccount {␊ + use openzeppelin_interfaces::accounts::EthPublicKey;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::ClassHash;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl SRC6Impl = EthAccountComponent::SRC6Impl;␊ + #[abi(embed_v0)]␊ + impl SRC6CamelOnlyImpl = EthAccountComponent::SRC6CamelOnlyImpl;␊ + #[abi(embed_v0)]␊ + impl DeployableImpl = EthAccountComponent::DeployableImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyImpl = EthAccountComponent::PublicKeyImpl;␊ + #[abi(embed_v0)]␊ + impl PublicKeyCamelImpl = EthAccountComponent::PublicKeyCamelImpl;␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, public_key: EthPublicKey) {␊ + self.eth_account.initializer(public_key);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.eth_account.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.snap new file mode 100644 index 000000000..9b84315b3 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/account/account.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts new file mode 100644 index 000000000..9c1ddf68a --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts @@ -0,0 +1,91 @@ +import test from 'ava'; +import { custom } from '../../..'; + +import type { CustomOptions } from '../../../custom'; +import { buildCustom, defaults } from '../../../custom'; +import { printContract } from '../../../print'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; + +const withComponentsMacroON = { withComponents: true }; + +function testCustom(title: string, opts: Partial) { + test(title, t => { + const c = buildCustom({ + name: 'MyContract', + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: CustomOptions) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is(custom.print(options), printContract(buildCustom(options))); + }); +} + +testCustom('custom non-upgradeable', { + upgradeable: false, +}); + +testCustom('custom defaults', {}); + +testCustom('pausable', { + pausable: true, +}); + +testCustom('upgradeable', { + upgradeable: true, +}); + +testCustom('access control disabled', { + upgradeable: false, + access: AccessControl.None(), +}); + +testCustom('access control ownable', { + access: AccessControl.Ownable(), +}); + +testCustom('access control roles', { + access: AccessControl.Roles(), +}); + +testCustom('access control roles default admin rules (default opts)', { + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testCustom('access control roles default admin rules (custom opts)', { + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testCustom('pausable with access control disabled', { + // API should override access to true since it is required for pausable + access: AccessControl.None(), + pausable: true, + upgradeable: false, +}); + +testAPIEquivalence('custom API default'); + +testAPIEquivalence('custom API full upgradeable', { + name: 'CustomContract', + access: AccessControl.Roles(), + pausable: true, + upgradeable: true, +}); + +test('custom API assert defaults', async t => { + t.is(custom.print(custom.defaults), custom.print()); +}); + +test('API isAccessControlRequired', async t => { + t.is(custom.isAccessControlRequired({ pausable: true }), true); + t.is(custom.isAccessControlRequired({ upgradeable: true }), true); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.md new file mode 100644 index 000000000..1732c78b0 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.md @@ -0,0 +1,406 @@ +# Snapshot report for `src/tests/with_components_on/custom/custom.test.ts` + +The actual snapshot is saved in `custom.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## custom non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + mod MyContract {␊ + #[storage]␊ + struct Storage {}␊ + }␊ + ` + +## custom defaults + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Upgradeable, Ownable)]␊ + mod MyContract {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## pausable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Pausable, Ownable, Upgradeable)]␊ + mod MyContract {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Upgradeable, Ownable)]␊ + mod MyContract {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## access control disabled + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + mod MyContract {␊ + #[storage]␊ + struct Storage {}␊ + }␊ + ` + +## access control ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Ownable, Upgradeable)]␊ + mod MyContract {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## access control roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(AccessControl, SRC5, Upgradeable)]␊ + mod MyContract {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## access control roles default admin rules (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyContract {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## access control roles default admin rules (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyContract {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## pausable with access control disabled + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Pausable, Ownable)]␊ + mod MyContract {␊ + use starknet::ContractAddress;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.snap new file mode 100644 index 000000000..6a206fa63 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/custom/custom.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts new file mode 100644 index 000000000..8bfb12eb3 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts @@ -0,0 +1,198 @@ +import test from 'ava'; +import { erc1155 } from '../../..'; + +import type { ERC1155Options } from '../../../erc1155'; +import { buildERC1155, defaults } from '../../../erc1155'; +import { printContract } from '../../../print'; +import { royaltyInfoOptions } from '../../../set-royalty-info'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; + +const NAME = 'MyToken'; +const CUSTOM_NAME = 'CustomToken'; +const BASE_URI = 'https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/'; + +const withComponentsMacroON = { withComponents: true }; + +const allFeaturesON: Partial = { + mintable: true, + burnable: true, + pausable: true, + royaltyInfo: royaltyInfoOptions.enabledDefault, + upgradeable: true, +} as const; + +function testERC1155(title: string, opts: Partial) { + test(title, t => { + const c = buildERC1155({ + name: NAME, + baseUri: BASE_URI, + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: ERC1155Options) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is(erc1155.print(options), printContract(buildERC1155(options))); + }); +} + +testERC1155('basic non-upgradeable', { + upgradeable: false, +}); + +testERC1155('basic', {}); + +testERC1155('basic + roles', { + access: AccessControl.Roles(), +}); + +testERC1155('no updatable uri', { + updatableUri: false, +}); + +testERC1155('burnable', { + burnable: true, +}); + +testERC1155('pausable', { + pausable: true, +}); + +testERC1155('mintable', { + mintable: true, +}); + +testERC1155('mintable + roles', { + mintable: true, + access: AccessControl.Roles(), +}); + +testERC1155('mintable + roles DAR (default opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC1155('mintable + roles DAR (custom opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC1155('royalty info disabled', { + royaltyInfo: royaltyInfoOptions.disabled, +}); + +testERC1155('royalty info enabled default + ownable', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.Ownable(), +}); + +testERC1155('royalty info enabled default + roles', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.Roles(), +}); + +testERC1155('royalty info enabled default + roles-DAR (custom opts)', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC1155('royalty info enabled custom + ownable', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.Ownable(), +}); + +testERC1155('royalty info enabled custom + roles', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.Roles(), +}); + +testERC1155('royalty info enabled custom + roles-DAR (default opts)', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC1155('royalty info enabled custom + roles-DAR (custom opts)', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC1155('full non-upgradeable roles', { + ...allFeaturesON, + access: AccessControl.Roles(), + upgradeable: false, +}); + +testERC1155('full upgradeable roles', { + ...allFeaturesON, + access: AccessControl.Roles(), + upgradeable: true, +}); + +testERC1155('full non-upgradeable roles-DAR (default opts)', { + ...allFeaturesON, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), + upgradeable: false, +}); + +testERC1155('full non-upgradeable roles-DAR (custom opts)', { + ...allFeaturesON, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), + upgradeable: false, +}); + +testERC1155('full upgradeable roles-DAR (default opts)', { + ...allFeaturesON, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), + upgradeable: true, +}); + +testERC1155('full upgradeable roles-DAR (custom opts)', { + ...allFeaturesON, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), + upgradeable: true, +}); + +testAPIEquivalence('API default'); + +testAPIEquivalence('API basic', { name: CUSTOM_NAME, baseUri: BASE_URI }); + +testAPIEquivalence('API full upgradeable', { + ...allFeaturesON, + name: CUSTOM_NAME, + baseUri: BASE_URI, + access: AccessControl.Roles(), + upgradeable: true, +}); + +test('API assert defaults', async t => { + t.is(erc1155.print(erc1155.defaults), erc1155.print()); +}); + +test('API isAccessControlRequired', async t => { + t.is(erc1155.isAccessControlRequired({ updatableUri: false, mintable: true }), true); + t.is(erc1155.isAccessControlRequired({ updatableUri: false, pausable: true }), true); + t.is(erc1155.isAccessControlRequired({ updatableUri: false, upgradeable: true }), true); + t.is(erc1155.isAccessControlRequired({ updatableUri: true }), true); + t.is( + erc1155.isAccessControlRequired({ + royaltyInfo: royaltyInfoOptions.enabledDefault, + }), + true, + ); + t.is( + erc1155.isAccessControlRequired({ + royaltyInfo: royaltyInfoOptions.enabledCustom, + }), + true, + ); + t.is(erc1155.isAccessControlRequired({ updatableUri: false }), false); + t.is(erc1155.isAccessControlRequired({}), true); // updatableUri is true by default +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.md new file mode 100644 index 000000000..71b6069ba --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.md @@ -0,0 +1,2598 @@ +# Snapshot report for `src/tests/with_components_on/erc1155/erc1155.test.ts` + +The actual snapshot is saved in `erc1155.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## basic non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::ContractAddress;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + }␊ + ` + +## basic + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## basic + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControl, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## no updatable uri + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## burnable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## pausable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## mintable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControl, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControlDefaultAdminRules, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControlDefaultAdminRules, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info disabled + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControl, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Ownable, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.ownable.assert_only_owner();␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControl, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc1155::ERC1155HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## full non-upgradeable roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControl, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + }␊ + ` + +## full upgradeable roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControl, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## full non-upgradeable roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControlDefaultAdminRules, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + }␊ + ` + +## full non-upgradeable roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControlDefaultAdminRules, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + }␊ + ` + +## full upgradeable roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## full upgradeable roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC1155, SRC5, Pausable, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + uri_setter: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(URI_SETTER_ROLE, uri_setter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait {␊ + fn before_update(␊ + ref self: ERC1155Component::ComponentState,␊ + from: ContractAddress,␊ + to: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.burn(account, token_id, value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_burn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + ) {␊ + let caller = get_caller_address();␊ + if account != caller {␊ + assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ + }␊ + self.erc1155.batch_burn(account, token_ids, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchBurn(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + ) {␊ + self.batch_burn(account, tokenIds, values);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_id: u256,␊ + value: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batch_mint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + token_ids: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn batchMint(␊ + ref self: ContractState,␊ + account: ContractAddress,␊ + tokenIds: Span,␊ + values: Span,␊ + data: Span,␊ + ) {␊ + self.batch_mint(account, tokenIds, values, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ + self.access_control_dar.assert_only_role(URI_SETTER_ROLE);␊ + self.erc1155._set_base_uri(base_uri);␊ + }␊ + ␊ + #[external(v0)]␊ + fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ + self.set_base_uri(baseUri);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.snap new file mode 100644 index 000000000..433751a7b Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/erc1155/erc1155.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts new file mode 100644 index 000000000..90cad23fd --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts @@ -0,0 +1,257 @@ +import test from 'ava'; + +import type { ERC20Options } from '../../../erc20'; +import { buildERC20, getInitialSupply, defaults } from '../../../erc20'; +import { printContract } from '../../../print'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; + +import type { OptionsError } from '../../..'; +import { erc20 } from '../../..'; + +const withComponentsMacroON = { withComponents: true }; + +function testERC20(title: string, opts: Partial) { + test(title, t => { + const c = buildERC20({ + name: 'MyToken', + symbol: 'MTK', + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: ERC20Options) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is(erc20.print(options), printContract(buildERC20(options))); + }); +} + +testERC20('basic erc20, non-upgradeable', { + upgradeable: false, +}); + +testERC20('basic erc20', {}); + +testERC20('erc20 burnable', { + burnable: true, +}); + +testERC20('erc20 pausable', { + pausable: true, + access: AccessControl.Ownable(), +}); + +testERC20('erc20 pausable with roles', { + pausable: true, + access: AccessControl.Roles(), +}); + +testERC20('erc20 pausable with roles-DAR (default opts)', { + pausable: true, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC20('erc20 pausable with roles-DAR (custom opts)', { + pausable: true, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC20('erc20 burnable pausable', { + burnable: true, + pausable: true, +}); + +testERC20('erc20 preminted', { + premint: '1000', +}); + +testERC20('erc20 premint of 0', { + premint: '0', +}); + +testERC20('erc20 votes, custom decimals', { + decimals: '6', +}); + +test('erc20 votes, decimals too high', async t => { + const error = t.throws(() => + buildERC20({ + name: 'MyToken', + symbol: 'MTK', + decimals: '256', + }), + ); + t.is((error as OptionsError).messages.decimals, 'Value is greater than u8 max value'); +}); + +testERC20('erc20 mintable', { + mintable: true, + access: AccessControl.Ownable(), +}); + +testERC20('erc20 mintable with roles', { + mintable: true, + access: AccessControl.Roles(), +}); + +testERC20('erc20 mintable with roles-DAR (default opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC20('erc20 mintable with roles-DAR (custom opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC20('erc20 votes', { + votes: true, + appName: 'MY_DAPP_NAME', +}); + +testERC20('erc20 votes, version', { + votes: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +test('erc20 votes, no name', async t => { + const error = t.throws(() => + buildERC20({ + name: 'MyToken', + symbol: 'MTK', + votes: true, + }), + ); + t.is((error as OptionsError).messages.appName, 'Application Name is required when Votes are enabled'); +}); + +test('erc20 votes, empty version', async t => { + const error = t.throws(() => + buildERC20({ + name: 'MyToken', + symbol: 'MTK', + votes: true, + appName: 'MY_DAPP_NAME', + appVersion: '', // avoids default value of v1 + }), + ); + t.is((error as OptionsError).messages.appVersion, 'Application Version is required when Votes are enabled'); +}); + +testERC20('erc20 votes, non-upgradeable', { + votes: true, + appName: 'MY_DAPP_NAME', + upgradeable: false, +}); + +testERC20('erc20 full, non-upgradeable', { + premint: '2000', + access: AccessControl.Ownable(), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: false, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +testERC20('erc20 full upgradeable', { + premint: '2000', + access: AccessControl.Ownable(), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +testERC20('erc20 full upgradeable with roles', { + premint: '2000', + access: AccessControl.Roles(), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +testERC20('erc20 full upgradeable with roles-DAR (default opts)', { + premint: '2000', + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +testERC20('erc20 full upgradeable with roles-DAR (custom opts)', { + premint: '2000', + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +testAPIEquivalence('erc20 API default'); + +testAPIEquivalence('erc20 API basic', { name: 'CustomToken', symbol: 'CTK', decimals: '6' }); + +testAPIEquivalence('erc20 API full upgradeable', { + name: 'CustomToken', + symbol: 'CTK', + decimals: '6', + premint: '2000', + access: AccessControl.Roles(), + burnable: true, + mintable: true, + votes: true, + pausable: true, + upgradeable: true, + appName: 'MY_DAPP_NAME', + appVersion: 'MY_DAPP_VERSION', +}); + +test('erc20 API assert defaults', async t => { + t.is(erc20.print(erc20.defaults), erc20.print()); +}); + +test('erc20 API isAccessControlRequired', async t => { + t.is(erc20.isAccessControlRequired({ mintable: true }), true); + t.is(erc20.isAccessControlRequired({ pausable: true }), true); + t.is(erc20.isAccessControlRequired({ upgradeable: true }), true); +}); + +test('erc20 getInitialSupply', async t => { + t.is(getInitialSupply('1000', 18), '1000000000000000000000'); + t.is(getInitialSupply('1000.1', 18), '1000100000000000000000'); + t.is(getInitialSupply('.1', 18), '100000000000000000'); + t.is(getInitialSupply('.01', 2), '1'); + + let error = t.throws(() => getInitialSupply('.01', 1)); + t.not(error, undefined); + t.is((error as OptionsError).messages.premint, 'Too many decimals'); + + error = t.throws(() => getInitialSupply('1.1.1', 18)); + t.not(error, undefined); + t.is((error as OptionsError).messages.premint, 'Not a valid number'); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.md new file mode 100644 index 000000000..ed292a093 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.md @@ -0,0 +1,1769 @@ +# Snapshot report for `src/tests/with_components_on/erc20/erc20.test.ts` + +The actual snapshot is saved in `erc20.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## basic erc20, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20)]␊ + mod MyToken {␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + }␊ + }␊ + ` + +## basic erc20 + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 burnable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 pausable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 pausable with roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControl, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 pausable with roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 pausable with roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 burnable pausable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 preminted + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, recipient: ContractAddress, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + ␊ + self.erc20.mint(recipient, 1000000000000000000000);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 premint of 0 + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 votes, custom decimals + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::ERC20HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC20ImmutableConfig of ERC20Component::ImmutableConfig {␊ + const DECIMALS: u8 = 6;␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 mintable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.ownable.assert_only_owner();␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 mintable with roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, AccessControl, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 mintable with roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 mintable with roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, AccessControlDefaultAdminRules, SRC5, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 votes + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Nonces, Votes, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + 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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 votes, version + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Nonces, Votes, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 votes, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Nonces, Votes)]␊ + mod MyToken {␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::ContractAddress;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + 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'␊ + }␊ + }␊ + }␊ + ` + +## erc20 full, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, Ownable, Nonces, Votes)]␊ + mod MyToken {␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, recipient: ContractAddress, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + ␊ + self.erc20.mint(recipient, 2000000000000000000000);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + ␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + self.erc20.burn(get_caller_address(), value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.ownable.assert_only_owner();␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ + }␊ + ` + +## erc20 full upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, Ownable, Nonces, Votes, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, recipient: ContractAddress, owner: ContractAddress) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.ownable.initializer(owner);␊ + ␊ + self.erc20.mint(recipient, 2000000000000000000000);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + ␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + self.erc20.burn(get_caller_address(), value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.ownable.assert_only_owner();␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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);␊ + }␊ + }␊ + }␊ + ` + +## erc20 full upgradeable with roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControl, SRC5, Nonces, Votes, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control.initializer();␊ + ␊ + self.erc20.mint(recipient, 2000000000000000000000);␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + ␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + self.erc20.burn(get_caller_address(), value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 full upgradeable with roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControlDefaultAdminRules, SRC5, Nonces, Votes, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.erc20.mint(recipient, 2000000000000000000000);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + ␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + self.erc20.burn(get_caller_address(), value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## erc20 full upgradeable with roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC20, Pausable, AccessControlDefaultAdminRules, SRC5, Nonces, Votes, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc20::DefaultConfig as ERC20DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + initial_default_admin: ContractAddress,␊ + pauser: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc20.initializer("MyToken", "MTK");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.erc20.mint(recipient, 2000000000000000000000);␊ + self.access_control_dar._grant_role(PAUSER_ROLE, pauser);␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl ERC20HooksImpl of ERC20Component::ERC20HooksTrait {␊ + fn before_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + ␊ + fn after_update(␊ + ref self: ERC20Component::ComponentState,␊ + from: ContractAddress,␊ + recipient: ContractAddress,␊ + amount: u256,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.votes.transfer_voting_units(from, recipient, amount);␊ + }␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.access_control_dar.assert_only_role(PAUSER_ROLE);␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, value: u256) {␊ + self.erc20.burn(get_caller_address(), value);␊ + }␊ + ␊ + #[external(v0)]␊ + fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc20.mint(recipient, amount);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.snap new file mode 100644 index 000000000..1a5142c98 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/erc20/erc20.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts new file mode 100644 index 000000000..9ee80f264 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts @@ -0,0 +1,246 @@ +import test from 'ava'; + +import type { ERC721Options } from '../../../erc721'; +import { buildERC721, defaults } from '../../../erc721'; +import { printContract } from '../../../print'; +import { royaltyInfoOptions } from '../../../set-royalty-info'; +import { AccessControl, darDefaultOpts, darCustomOpts } from '../../../set-access-control'; + +import type { OptionsError } from '../../..'; +import { erc721 } from '../../..'; + +const NAME = 'MyToken'; +const CUSTOM_NAME = 'CustomToken'; +const SYMBOL = 'MTK'; +const CUSTOM_SYMBOL = 'CTK'; +const APP_NAME = 'MY_DAPP_NAME'; +const APP_VERSION = 'MY_DAPP_VERSION'; +const BASE_URI = 'https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/'; + +const withComponentsMacroON = { withComponents: true }; + +const allFeaturesON: Partial = { + mintable: true, + burnable: true, + pausable: true, + enumerable: true, + royaltyInfo: royaltyInfoOptions.enabledDefault, + votes: true, + appName: APP_NAME, + appVersion: APP_VERSION, + upgradeable: true, +} as const; + +function testERC721(title: string, opts: Partial) { + test(title, t => { + const c = buildERC721({ + name: NAME, + symbol: SYMBOL, + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: ERC721Options) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is(erc721.print(options), printContract(buildERC721(options))); + }); +} + +testERC721('basic non-upgradeable', { + upgradeable: false, +}); + +testERC721('basic', {}); + +testERC721('base uri', { + baseUri: BASE_URI, +}); + +testERC721('burnable', { + burnable: true, +}); + +testERC721('pausable', { + pausable: true, +}); + +testERC721('mintable', { + mintable: true, +}); + +testERC721('enumerable', { + enumerable: true, +}); + +testERC721('pausable + enumerable', { + pausable: true, + enumerable: true, +}); + +testERC721('mintable + roles', { + mintable: true, + access: AccessControl.Roles(), +}); + +testERC721('mintable + roles-DAR (default opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC721('mintable + roles-DAR (custom opts)', { + mintable: true, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC721('royalty info disabled', { + royaltyInfo: royaltyInfoOptions.disabled, +}); + +testERC721('royalty info enabled default + ownable', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.Ownable(), +}); + +testERC721('royalty info enabled default + roles', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.Roles(), +}); + +testERC721('royalty info enabled default + roles-DAR (default opts)', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC721('royalty info enabled default + roles-DAR (custom opts)', { + royaltyInfo: royaltyInfoOptions.enabledDefault, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC721('royalty info enabled custom + ownable', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.Ownable(), +}); + +testERC721('royalty info enabled custom + roles', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.Roles(), +}); + +testERC721('royalty info enabled custom + roles-DAR (default opts)', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.RolesDefaultAdminRules(darDefaultOpts), +}); + +testERC721('royalty info enabled custom + roles-DAR (custom opts)', { + royaltyInfo: royaltyInfoOptions.enabledCustom, + access: AccessControl.RolesDefaultAdminRules(darCustomOpts), +}); + +testERC721('full non-upgradeable', { + ...allFeaturesON, + upgradeable: false, +}); + +testERC721('erc721 votes', { + votes: true, + appName: APP_NAME, +}); + +testERC721('erc721 votes, version', { + votes: true, + appName: APP_NAME, + appVersion: APP_VERSION, +}); + +test('erc721 votes, no name', async t => { + const error = t.throws(() => + buildERC721({ + name: NAME, + symbol: SYMBOL, + votes: true, + }), + ); + t.is((error as OptionsError).messages.appName, 'Application Name is required when Votes are enabled'); +}); + +test('erc721 votes, no version', async t => { + const error = t.throws(() => + buildERC721({ + name: NAME, + symbol: SYMBOL, + votes: true, + appName: APP_NAME, + appVersion: '', + }), + ); + t.is((error as OptionsError).messages.appVersion, 'Application Version is required when Votes are enabled'); +}); + +test('erc721 votes, empty version', async t => { + const error = t.throws(() => + buildERC721({ + name: NAME, + symbol: SYMBOL, + votes: true, + appName: APP_NAME, + appVersion: '', // avoids default value of v1 + }), + ); + t.is((error as OptionsError).messages.appVersion, 'Application Version is required when Votes are enabled'); +}); + +testERC721('erc721 votes, non-upgradeable', { + votes: true, + appName: APP_NAME, + upgradeable: false, +}); + +testERC721('full upgradeable', allFeaturesON); + +testAPIEquivalence('API default'); + +testAPIEquivalence('API basic', { name: CUSTOM_NAME, symbol: CUSTOM_SYMBOL }); + +testAPIEquivalence('API full upgradeable', { + ...allFeaturesON, + name: CUSTOM_NAME, + symbol: CUSTOM_SYMBOL, +}); + +test('API assert defaults', async t => { + t.is(erc721.print(erc721.defaults), erc721.print()); +}); + +test('API isAccessControlRequired', async t => { + t.is(erc721.isAccessControlRequired({ mintable: true }), true); + t.is(erc721.isAccessControlRequired({ pausable: true }), true); + t.is(erc721.isAccessControlRequired({ upgradeable: true }), true); + t.is( + erc721.isAccessControlRequired({ + royaltyInfo: royaltyInfoOptions.enabledDefault, + }), + true, + ); + t.is( + erc721.isAccessControlRequired({ + royaltyInfo: royaltyInfoOptions.enabledCustom, + }), + true, + ); + t.is( + erc721.isAccessControlRequired({ + royaltyInfo: royaltyInfoOptions.disabled, + }), + false, + ); + t.is(erc721.isAccessControlRequired({ burnable: true }), false); + t.is(erc721.isAccessControlRequired({ enumerable: true }), false); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts.md new file mode 100644 index 000000000..c5fd26f25 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts.md @@ -0,0 +1,1777 @@ +# Snapshot report for `src/tests/with_components_on/erc721/erc721.test.ts` + +The actual snapshot is saved in `erc721.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## basic non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5)]␊ + mod MyToken {␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + }␊ + }␊ + ` + +## basic + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## base uri + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## burnable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use core::num::traits::Zero;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, token_id: u256) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## pausable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Pausable, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let contract_state = self.get_contract();␊ + contract_state.pausable.assert_not_paused();␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## mintable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Ownable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.ownable.assert_only_owner();␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## enumerable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, ERC721Enumerable, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC721EnumerableImpl = ERC721EnumerableComponent::ERC721EnumerableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.erc721_enumerable.initializer();␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.erc721_enumerable.before_update(to, token_id);␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## pausable + enumerable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Pausable, Ownable, ERC721Enumerable, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC721EnumerableImpl = ERC721EnumerableComponent::ERC721EnumerableImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + self.erc721_enumerable.initializer();␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.pausable.assert_not_paused();␊ + contract_state.erc721_enumerable.before_update(to, token_id);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + 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);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControl, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control.initializer();␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(MINTER_ROLE, minter);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.access_control.assert_only_role(MINTER_ROLE);␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + self.safe_mint(recipient, tokenId, data);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + self.safe_mint(recipient, tokenId, data);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## mintable + roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::{MINTER_ROLE, UPGRADER_ROLE};␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + minter: ContractAddress,␊ + upgrader: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + ␊ + self.access_control_dar._grant_role(MINTER_ROLE, minter);␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.access_control_dar.assert_only_role(MINTER_ROLE);␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + self.safe_mint(recipient, tokenId, data);␊ + }␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info disabled + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Ownable, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControl, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._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) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._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) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled default + roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + ownable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Ownable, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControl, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::DEFAULT_ADMIN_ROLE;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ + self.access_control._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles-DAR (default opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_access::accesscontrol::extensions::DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 86400; // 1 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## royalty info enabled custom + roles-DAR (custom opts) + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, AccessControlDefaultAdminRules, Upgradeable, ERC2981)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::erc721::ERC721HooksEmptyImpl;␊ + use starknet::{ClassHash, ContractAddress};␊ + use super::UPGRADER_ROLE;␊ + ␊ + const INITIAL_DELAY: u64 = 172800; // 2 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlImpl = AccessControlDefaultAdminRulesComponent::AccessControlImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlDefaultAdminRulesImpl = AccessControlDefaultAdminRulesComponent::AccessControlDefaultAdminRulesImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlCamelImpl = AccessControlDefaultAdminRulesComponent::AccessControlCamelImpl;␊ + #[abi(embed_v0)]␊ + impl AccessControlWithDelayImpl = AccessControlDefaultAdminRulesComponent::AccessControlWithDelayImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminAccessControlDefaultAdminRulesImpl = ERC2981Component::ERC2981AdminAccessControlDefaultAdminRulesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + initial_default_admin: ContractAddress,␊ + upgrader: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + royalty_admin: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.access_control_dar.initializer(INITIAL_DELAY, initial_default_admin);␊ + self.erc2981.initializer(default_royalty_receiver, 15125);␊ + ␊ + self.access_control_dar._grant_role(UPGRADER_ROLE, upgrader);␊ + self.access_control_dar._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ + }␊ + ␊ + impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊ + const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊ + }␊ + ␊ + impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ + const FEE_DENOMINATOR: u128 = 100000;␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.access_control_dar.assert_only_role(UPGRADER_ROLE);␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## full non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Pausable, Ownable, ERC721Enumerable, ERC2981, Nonces, Votes)]␊ + mod MyToken {␊ + use core::num::traits::Zero;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC721EnumerableImpl = ERC721EnumerableComponent::ERC721EnumerableImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + self.erc721_enumerable.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.pausable.assert_not_paused();␊ + contract_state.erc721_enumerable.before_update(to, token_id);␊ + let previous_owner = self._owner_of(token_id);␊ + contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, token_id: u256) {␊ + self.erc721.update(Zero::zero(), token_id, get_caller_address());␊ + }␊ + ␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.ownable.assert_only_owner();␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + self.safe_mint(recipient, tokenId, data);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'MY_DAPP_VERSION'␊ + }␊ + }␊ + }␊ + ` + +## erc721 votes + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable, Nonces, Votes)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + let previous_owner = self._owner_of(token_id);␊ + contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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);␊ + }␊ + }␊ + }␊ + ` + +## erc721 votes, version + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Upgradeable, Ownable, Nonces, Votes)]␊ + mod MyToken {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + let previous_owner = self._owner_of(token_id);␊ + contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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);␊ + }␊ + }␊ + }␊ + ` + +## erc721 votes, non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Nonces, Votes)]␊ + mod MyToken {␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::ContractAddress;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + let previous_owner = self._owner_of(token_id);␊ + contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + 'v1'␊ + }␊ + }␊ + }␊ + ` + +## full upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(ERC721, SRC5, Pausable, Ownable, ERC721Enumerable, Upgradeable, ERC2981, Nonces, Votes)]␊ + mod MyToken {␊ + use core::num::traits::Zero;␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_token::common::erc2981::DefaultConfig as ERC2981DefaultConfig;␊ + use openzeppelin_utils::contract_clock::ERC6372TimestampClock;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress, get_caller_address};␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ + #[abi(embed_v0)]␊ + impl PausableImpl = PausableComponent::PausableImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + #[abi(embed_v0)]␊ + impl ERC721EnumerableImpl = ERC721EnumerableComponent::ERC721EnumerableImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981Impl = ERC2981Component::ERC2981Impl;␊ + #[abi(embed_v0)]␊ + impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl;␊ + #[abi(embed_v0)]␊ + impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl;␊ + #[abi(embed_v0)]␊ + impl NoncesImpl = NoncesComponent::NoncesImpl;␊ + #[abi(embed_v0)]␊ + impl VotesImpl = VotesComponent::VotesImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + owner: ContractAddress,␊ + default_royalty_receiver: ContractAddress,␊ + ) {␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + self.ownable.initializer(owner);␊ + self.erc721_enumerable.initializer();␊ + self.erc2981.initializer(default_royalty_receiver, 500);␊ + }␊ + ␊ + impl ERC721HooksImpl of ERC721Component::ERC721HooksTrait {␊ + fn before_update(␊ + ref self: ERC721Component::ComponentState,␊ + to: ContractAddress,␊ + token_id: u256,␊ + auth: ContractAddress,␊ + ) {␊ + let mut contract_state = self.get_contract_mut();␊ + contract_state.pausable.assert_not_paused();␊ + contract_state.erc721_enumerable.before_update(to, token_id);␊ + let previous_owner = self._owner_of(token_id);␊ + contract_state.votes.transfer_voting_units(previous_owner, to, 1);␊ + }␊ + }␊ + ␊ + #[generate_trait]␊ + #[abi(per_item)]␊ + impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ + fn pause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.pause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn unpause(ref self: ContractState) {␊ + self.ownable.assert_only_owner();␊ + self.pausable.unpause();␊ + }␊ + ␊ + #[external(v0)]␊ + fn burn(ref self: ContractState, token_id: u256) {␊ + self.erc721.update(Zero::zero(), token_id, get_caller_address());␊ + }␊ + ␊ + #[external(v0)]␊ + fn safe_mint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + token_id: u256,␊ + data: Span,␊ + ) {␊ + self.ownable.assert_only_owner();␊ + self.erc721.safe_mint(recipient, token_id, data);␊ + }␊ + ␊ + #[external(v0)]␊ + fn safeMint(␊ + ref self: ContractState,␊ + recipient: ContractAddress,␊ + tokenId: u256,␊ + data: Span,␊ + ) {␊ + self.safe_mint(recipient, tokenId, data);␊ + }␊ + }␊ + ␊ + //␊ + // SNIP12 Metadata␊ + //␊ + ␊ + impl SNIP12MetadataImpl of SNIP12Metadata {␊ + fn name() -> felt252 {␊ + 'MY_DAPP_NAME'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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_alpha/src/tests/with_components_on/erc721/erc721.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts.snap new file mode 100644 index 000000000..fc9d14a76 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/erc721/erc721.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts new file mode 100644 index 000000000..5ed04769c --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts @@ -0,0 +1,181 @@ +import test from 'ava'; +import { governor } from '../../..'; + +import type { GovernorOptions } from '../../../governor'; +import { buildGovernor, defaults } from '../../../governor'; +import { printContract } from '../../../print'; + +const NAME = 'MyGovernor'; +const withComponentsMacroON = { withComponents: true }; + +function testGovernor(title: string, opts: Partial) { + test(title, t => { + const c = buildGovernor({ + name: NAME, + delay: '1 day', + period: '1 week', + ...opts, + macros: withComponentsMacroON, + }); + t.snapshot(printContract(c)); + }); +} + +/** + * Tests external API for equivalence with internal API + */ +function testAPIEquivalence(title: string, opts?: GovernorOptions) { + const options = opts === undefined ? defaults : opts; + options.macros = withComponentsMacroON; + test(title, t => { + t.is(governor.print(options), printContract(buildGovernor(options))); + }); +} + +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', { + name: 'CustomGovernor', + delay: '1 day', + period: '1 week', +}); + +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_alpha/src/tests/with_components_on/governor/governor.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts.md new file mode 100644 index 000000000..c950c04b5 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts.md @@ -0,0 +1,860 @@ +# Snapshot report for `src/tests/with_components_on/governor/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 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## basic non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## erc721 votes + timelock + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## custom name + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod CustomGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## custom settings + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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 = 300000000000000000000; // 300 * pow!(10, 18)␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## quorum mode absolute + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotes, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + use openzeppelin_utils::cryptography::snip12::SNIP12Metadata;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl VotesTokenImpl = GovernorVotesComponent::VotesTokenImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[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);␊ + }␊ + ␊ + //␊ + // 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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## quorum mode percent + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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'␊ + }␊ + }␊ + ␊ + //␊ + // 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);␊ + }␊ + }␊ + }␊ + ` + +## custom snip12 metadata + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotesQuorumFraction, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl QuorumFractionImpl = GovernorVotesQuorumFractionComponent::QuorumFractionImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(␊ + ref self: ContractState,␊ + votes_token: ContractAddress,␊ + timelock_controller: ContractAddress,␊ + ) {␊ + self.governor.initializer();␊ + self.governor_votes_quorum_fraction.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 {␊ + 'Governor'␊ + }␊ + ␊ + fn version() -> felt252 {␊ + '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);␊ + }␊ + }␊ + }␊ + ` + +## all options + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Governor, SRC5, GovernorCountingSimple, GovernorVotes, GovernorSettings, GovernorTimelockExecution, Upgradeable)]␊ + mod MyGovernor {␊ + use openzeppelin_governance::governor::DefaultConfig as GovernorDefaultConfig;␊ + 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_interfaces::upgrades::IUpgradeable;␊ + 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;␊ + ␊ + // Extensions (external)␊ + #[abi(embed_v0)]␊ + impl VotesTokenImpl = GovernorVotesComponent::VotesTokenImpl;␊ + #[abi(embed_v0)]␊ + impl GovernorSettingsAdminImpl = GovernorSettingsComponent::GovernorSettingsAdminImpl;␊ + #[abi(embed_v0)]␊ + impl TimelockedImpl = GovernorTimelockExecutionComponent::TimelockedImpl;␊ + ␊ + // Governor Core␊ + #[abi(embed_v0)]␊ + impl GovernorImpl = GovernorComponent::GovernorImpl;␊ + ␊ + // SRC5␊ + #[abi(embed_v0)]␊ + impl SRC5Impl = SRC5Component::SRC5Impl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[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);␊ + }␊ + ␊ + //␊ + // 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'␊ + }␊ + }␊ + ␊ + //␊ + // 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_alpha/src/tests/with_components_on/governor/governor.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts.snap new file mode 100644 index 000000000..e5f4f2f10 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/governor/governor.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts new file mode 100644 index 000000000..1c594ba3a --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts @@ -0,0 +1,121 @@ +import test from 'ava'; +import type { OptionsError } from '../../..'; +import { multisig } from '../../..'; +import type { MultisigOptions } from '../../../multisig'; +import { buildMultisig } from '../../../multisig'; +import { contractDefaults as commonDefaults } from '../../../common-options'; +import { printContract } from '../../../print'; + +const defaults: MultisigOptions = { + name: 'MyMultisig', + quorum: '2', + upgradeable: commonDefaults.upgradeable, + info: commonDefaults.info, + macros: { withComponents: true }, +}; + +const CUSTOM_NAME = 'CustomMultisig'; +const CUSTOM_QUORUM = '42'; + +// +// Test helpers +// + +function testMultisig(title: string, opts: Partial) { + test(title, t => { + const c = buildMultisig({ + ...defaults, + ...opts, + }); + t.snapshot(printContract(c)); + }); +} + +function testAPIEquivalence(title: string, opts?: MultisigOptions) { + test(title, t => { + t.is( + multisig.print(opts), + printContract( + buildMultisig({ + ...defaults, + ...opts, + }), + ), + ); + }); +} + +// +// Snapshot tests +// + +testMultisig('custom name', { + name: CUSTOM_NAME, +}); + +testMultisig('custom quorum', { + quorum: CUSTOM_QUORUM, +}); + +testMultisig('all custom settings', { + name: CUSTOM_NAME, + quorum: CUSTOM_QUORUM, +}); + +testMultisig('upgradeable', { + upgradeable: true, +}); + +testMultisig('non-upgradeable', { + upgradeable: false, +}); + +// +// API tests +// + +testAPIEquivalence('API custom name', { + ...defaults, + name: CUSTOM_NAME, +}); + +testAPIEquivalence('API custom quorum', { + ...defaults, + quorum: CUSTOM_QUORUM, +}); + +testAPIEquivalence('API all custom settings', { + ...defaults, + name: CUSTOM_NAME, + quorum: CUSTOM_QUORUM, +}); + +testAPIEquivalence('API upgradeable', { + ...defaults, + upgradeable: true, +}); + +testAPIEquivalence('API non-upgradeable', { + ...defaults, + upgradeable: false, +}); + +test('quorum is 0', async t => { + const error = t.throws(() => + buildMultisig({ + ...defaults, + quorum: '0', + }), + ); + t.is((error as OptionsError).messages.quorum, 'Quorum cannot be 0'); +}); + +test('negative quorum', async t => { + const error = t.throws(() => + buildMultisig({ + ...defaults, + quorum: '-1', + }), + ); + t.is((error as OptionsError).messages.quorum, 'Not a valid number'); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.md new file mode 100644 index 000000000..418041613 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.md @@ -0,0 +1,197 @@ +# Snapshot report for `src/tests/with_components_on/multisig/multisig.test.ts` + +The actual snapshot is saved in `multisig.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## custom name + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Multisig, Upgradeable)]␊ + mod CustomMultisig {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const INITIAL_QUORUM: u32 = 2;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl MultisigImpl = MultisigComponent::MultisigImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, signers: Span) {␊ + self.multisig.initializer(INITIAL_QUORUM, signers);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.multisig.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## custom quorum + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Multisig, Upgradeable)]␊ + mod MyMultisig {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const INITIAL_QUORUM: u32 = 42;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl MultisigImpl = MultisigComponent::MultisigImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, signers: Span) {␊ + self.multisig.initializer(INITIAL_QUORUM, signers);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.multisig.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## all custom settings + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Multisig, Upgradeable)]␊ + mod CustomMultisig {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const INITIAL_QUORUM: u32 = 42;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl MultisigImpl = MultisigComponent::MultisigImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, signers: Span) {␊ + self.multisig.initializer(INITIAL_QUORUM, signers);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.multisig.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Multisig, Upgradeable)]␊ + mod MyMultisig {␊ + use openzeppelin_interfaces::upgrades::IUpgradeable;␊ + use starknet::{ClassHash, ContractAddress};␊ + ␊ + const INITIAL_QUORUM: u32 = 2;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl MultisigImpl = MultisigComponent::MultisigImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, signers: Span) {␊ + self.multisig.initializer(INITIAL_QUORUM, signers);␊ + }␊ + ␊ + //␊ + // Upgradeable␊ + //␊ + ␊ + #[abi(embed_v0)]␊ + impl UpgradeableImpl of IUpgradeable {␊ + fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ + self.multisig.assert_only_self();␊ + self.upgradeable.upgrade(new_class_hash);␊ + }␊ + }␊ + }␊ + ` + +## non-upgradeable + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Multisig)]␊ + mod MyMultisig {␊ + use starknet::ContractAddress;␊ + ␊ + const INITIAL_QUORUM: u32 = 2;␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl MultisigImpl = MultisigComponent::MultisigImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, signers: Span) {␊ + self.multisig.initializer(INITIAL_QUORUM, signers);␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.snap new file mode 100644 index 000000000..2e61e02cf Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/multisig/multisig.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts new file mode 100644 index 000000000..ca31214d8 --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts @@ -0,0 +1,132 @@ +import test from 'ava'; +import type { OptionsError } from '../../..'; +import { vesting } from '../../..'; +import type { VestingOptions } from '../../../vesting'; +import { buildVesting } from '../../../vesting'; +import { printContract } from '../../../print'; + +const defaults: VestingOptions = { + name: 'MyVesting', + startDate: '', + duration: '0 day', + cliffDuration: '0 day', + schedule: 'linear', + macros: { withComponents: true }, +}; + +const CUSTOM_NAME = 'CustomVesting'; +const CUSTOM_DATE = '2024-12-31T23:59'; +const CUSTOM_DURATION = '36 months'; +const CUSTOM_CLIFF = '90 days'; + +// +// Test helpers +// + +function testVesting(title: string, opts: Partial) { + test(title, t => { + const c = buildVesting({ + ...defaults, + ...opts, + }); + t.snapshot(printContract(c)); + }); +} + +function testAPIEquivalence(title: string, opts?: VestingOptions) { + test(title, t => { + t.is( + vesting.print(opts), + printContract( + buildVesting({ + ...defaults, + ...opts, + }), + ), + ); + }); +} + +// +// Snapshot tests +// + +testVesting('custom name', { + name: CUSTOM_NAME, +}); + +testVesting('custom start date', { + startDate: CUSTOM_DATE, +}); + +testVesting('custom duration', { + duration: CUSTOM_DURATION, +}); + +testVesting('custom cliff', { + duration: CUSTOM_DURATION, + cliffDuration: CUSTOM_CLIFF, +}); + +testVesting('custom schedule', { + schedule: 'custom', +}); + +testVesting('all custom settings', { + startDate: CUSTOM_DATE, + duration: CUSTOM_DURATION, + cliffDuration: CUSTOM_CLIFF, + schedule: 'custom', +}); + +// +// API tests +// + +testAPIEquivalence('API custom name', { + ...defaults, + name: CUSTOM_NAME, +}); + +testAPIEquivalence('API custom start date', { + ...defaults, + startDate: CUSTOM_DATE, +}); + +testAPIEquivalence('API custom duration', { + ...defaults, + duration: CUSTOM_DURATION, +}); + +testAPIEquivalence('API custom cliff', { + ...defaults, + duration: CUSTOM_DURATION, + cliffDuration: CUSTOM_CLIFF, +}); + +testAPIEquivalence('API custom schedule', { + ...defaults, + schedule: 'custom', +}); + +testAPIEquivalence('API all custom settings', { + ...defaults, + startDate: CUSTOM_DATE, + duration: CUSTOM_DURATION, + cliffDuration: CUSTOM_CLIFF, + schedule: 'custom', +}); + +test('cliff too high', async t => { + const error = t.throws(() => + buildVesting({ + ...defaults, + duration: '20 days', + cliffDuration: '21 days', + }), + ); + t.is( + (error as OptionsError).messages.cliffDuration, + 'Cliff duration must be less than or equal to the total duration', + ); +}); diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.md b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.md new file mode 100644 index 000000000..309194cbb --- /dev/null +++ b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.md @@ -0,0 +1,237 @@ +# Snapshot report for `src/tests/with_components_on/vesting/vesting.test.ts` + +The actual snapshot is saved in `vesting.test.ts.snap`. + +Generated by [AVA](https://avajs.dev). + +## custom name + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod CustomVesting {␊ + use openzeppelin_finance::vesting::LinearVestingSchedule;␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 0;␊ + const DURATION: u64 = 0; // 0 day␊ + const CLIFF_DURATION: u64 = 0; // 0 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + }␊ + ` + +## custom start date + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod MyVesting {␊ + use openzeppelin_finance::vesting::LinearVestingSchedule;␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 1735689540; // 31 Dec 2024, 23:59 (UTC)␊ + const DURATION: u64 = 0; // 0 day␊ + const CLIFF_DURATION: u64 = 0; // 0 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + }␊ + ` + +## custom duration + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod MyVesting {␊ + use openzeppelin_finance::vesting::LinearVestingSchedule;␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 0;␊ + const DURATION: u64 = 93312000; // 36 months␊ + const CLIFF_DURATION: u64 = 0; // 0 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + }␊ + ` + +## custom cliff + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod MyVesting {␊ + use openzeppelin_finance::vesting::LinearVestingSchedule;␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 0;␊ + const DURATION: u64 = 93312000; // 36 months␊ + const CLIFF_DURATION: u64 = 7776000; // 90 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + }␊ + ` + +## custom schedule + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod MyVesting {␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 0;␊ + const DURATION: u64 = 0; // 0 day␊ + const CLIFF_DURATION: u64 = 0; // 0 day␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl VestingSchedule of VestingComponent::VestingScheduleTrait {␊ + fn calculate_vested_amount(␊ + self: @VestingComponent::ComponentState,␊ + token: ContractAddress,␊ + total_allocation: u256,␊ + timestamp: u64,␊ + start: u64,␊ + duration: u64,␊ + cliff: u64,␊ + ) -> u256 {␊ + // TODO: Must be implemented according to the desired vesting schedule;␊ + 0␊ + }␊ + }␊ + }␊ + ` + +## all custom settings + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊ + ␊ + #[starknet::contract]␊ + #[with_components(Vesting, Ownable)]␊ + mod MyVesting {␊ + use starknet::ContractAddress;␊ + ␊ + const START: u64 = 1735689540; // 31 Dec 2024, 23:59 (UTC)␊ + const DURATION: u64 = 93312000; // 36 months␊ + const CLIFF_DURATION: u64 = 7776000; // 90 days␊ + ␊ + // External␊ + #[abi(embed_v0)]␊ + impl VestingImpl = VestingComponent::VestingImpl;␊ + #[abi(embed_v0)]␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ + ␊ + #[storage]␊ + struct Storage {}␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState, owner: ContractAddress) {␊ + self.vesting.initializer(START, DURATION, CLIFF_DURATION);␊ + self.ownable.initializer(owner);␊ + }␊ + ␊ + impl VestingSchedule of VestingComponent::VestingScheduleTrait {␊ + fn calculate_vested_amount(␊ + self: @VestingComponent::ComponentState,␊ + token: ContractAddress,␊ + total_allocation: u256,␊ + timestamp: u64,␊ + start: u64,␊ + duration: u64,␊ + cliff: u64,␊ + ) -> u256 {␊ + // TODO: Must be implemented according to the desired vesting schedule;␊ + 0␊ + }␊ + }␊ + }␊ + ` diff --git a/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.snap b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.snap new file mode 100644 index 000000000..b3c14a747 Binary files /dev/null and b/packages/core/cairo_alpha/src/tests/with_components_on/vesting/vesting.test.ts.snap differ diff --git a/packages/core/cairo_alpha/src/vesting.test.ts.snap b/packages/core/cairo_alpha/src/vesting.test.ts.snap deleted file mode 100644 index ea762b09e..000000000 Binary files a/packages/core/cairo_alpha/src/vesting.test.ts.snap and /dev/null differ diff --git a/packages/core/cairo_alpha/src/vesting.ts b/packages/core/cairo_alpha/src/vesting.ts index 9365aca35..2db672934 100644 --- a/packages/core/cairo_alpha/src/vesting.ts +++ b/packages/core/cairo_alpha/src/vesting.ts @@ -4,6 +4,7 @@ import { contractDefaults as commonDefaults } from './common-options'; import { AccessControl, setAccessControl } from './set-access-control'; import { setUpgradeable } from './set-upgradeable'; import type { Info } from './set-info'; +import type { MacrosOptions } from './set-macros'; import { setInfo } from './set-info'; import { defineComponents } from './utils/define-components'; import { printContract } from './print'; @@ -20,6 +21,7 @@ export const defaults: Required = { cliffDuration: '0 day', schedule: 'custom', info: commonDefaults.info, + macros: commonDefaults.macros, } as const; export function printVesting(opts: VestingOptions = defaults): string { @@ -33,6 +35,7 @@ export interface VestingOptions { cliffDuration: string; schedule: VestingSchedule; info?: Info; + macros?: MacrosOptions; } function withDefaults(opts: VestingOptions): Required { @@ -43,15 +46,16 @@ function withDefaults(opts: VestingOptions): Required { cliffDuration: opts.cliffDuration ?? defaults.cliffDuration, schedule: opts.schedule ?? defaults.schedule, info: opts.info ?? defaults.info, + macros: opts.macros ?? defaults.macros, }; } export function buildVesting(opts: VestingOptions): Contract { - const c = new ContractBuilder(opts.name); const allOpts = withDefaults(opts); + const c = new ContractBuilder(allOpts.name, allOpts.macros); - addBase(c, opts); - addSchedule(c, opts); + addBase(c, allOpts); + addSchedule(c, allOpts); setInfo(c, allOpts.info); // Vesting component depends on Ownable component @@ -106,7 +110,7 @@ function addBase(c: ContractBuilder, opts: VestingOptions) { function addSchedule(c: ContractBuilder, opts: VestingOptions) { switch (opts.schedule) { case 'linear': - c.addUseClause('openzeppelin::finance::vesting', 'LinearVestingSchedule'); + c.addUseClause('openzeppelin_finance::vesting', 'LinearVestingSchedule'); return; case 'custom': { const scheduleTrait: BaseImplementedTrait = { @@ -197,7 +201,7 @@ function validateDurations(duration: number, cliffDuration: number): void { const components = defineComponents({ VestingComponent: { - path: 'openzeppelin::finance::vesting', + path: 'openzeppelin_finance::vesting', substorage: { name: 'vesting', type: 'VestingComponent::Storage', @@ -209,6 +213,7 @@ const components = defineComponents({ impls: [ { name: 'VestingImpl', + embed: true, value: 'VestingComponent::VestingImpl', }, { diff --git a/packages/core/cairo_alpha/test_project/Scarb.lock b/packages/core/cairo_alpha/test_project/Scarb.lock index c668b8289..51480a013 100644 --- a/packages/core/cairo_alpha/test_project/Scarb.lock +++ b/packages/core/cairo_alpha/test_project/Scarb.lock @@ -1,25 +1,6 @@ # Code generated by scarb DO NOT EDIT. version = 1 -[[package]] -name = "openzeppelin" -version = "3.0.0-alpha.3" -source = "git+https://github.com/OpenZeppelin/cairo-contracts?tag=v3.0.0-alpha.3#ba2228ec4070c9a7ac08d2833ebcf6bcf7ff70ac" -dependencies = [ - "openzeppelin_access", - "openzeppelin_account", - "openzeppelin_finance", - "openzeppelin_governance", - "openzeppelin_interfaces", - "openzeppelin_introspection", - "openzeppelin_merkle_tree", - "openzeppelin_presets", - "openzeppelin_security", - "openzeppelin_token", - "openzeppelin_upgrades", - "openzeppelin_utils", -] - [[package]] name = "openzeppelin_access" version = "3.0.0-alpha.3" @@ -75,24 +56,9 @@ dependencies = [ ] [[package]] -name = "openzeppelin_merkle_tree" -version = "3.0.0-alpha.3" -source = "git+https://github.com/OpenZeppelin/cairo-contracts?tag=v3.0.0-alpha.3#ba2228ec4070c9a7ac08d2833ebcf6bcf7ff70ac" - -[[package]] -name = "openzeppelin_presets" +name = "openzeppelin_macros" version = "3.0.0-alpha.3" source = "git+https://github.com/OpenZeppelin/cairo-contracts?tag=v3.0.0-alpha.3#ba2228ec4070c9a7ac08d2833ebcf6bcf7ff70ac" -dependencies = [ - "openzeppelin_access", - "openzeppelin_account", - "openzeppelin_finance", - "openzeppelin_interfaces", - "openzeppelin_introspection", - "openzeppelin_token", - "openzeppelin_upgrades", - "openzeppelin_utils", -] [[package]] name = "openzeppelin_security" @@ -130,5 +96,15 @@ dependencies = [ name = "test_project" version = "0.1.0" dependencies = [ - "openzeppelin", + "openzeppelin_access", + "openzeppelin_account", + "openzeppelin_finance", + "openzeppelin_governance", + "openzeppelin_interfaces", + "openzeppelin_introspection", + "openzeppelin_macros", + "openzeppelin_security", + "openzeppelin_token", + "openzeppelin_upgrades", + "openzeppelin_utils", ] diff --git a/packages/core/cairo_alpha/test_project/Scarb.toml b/packages/core/cairo_alpha/test_project/Scarb.toml index 7df5b0a71..0f691c29e 100644 --- a/packages/core/cairo_alpha/test_project/Scarb.toml +++ b/packages/core/cairo_alpha/test_project/Scarb.toml @@ -6,8 +6,19 @@ cairo-version = "2.12.2" scarb-version = "2.12.2" [dependencies] +assert_macros = "2.12.2" starknet = "2.12.2" -openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_access = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_account = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_finance = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_interfaces = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_governance = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_introspection = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_security = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_token = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_upgrades = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_utils = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } +openzeppelin_macros = { git = "https://github.com/OpenZeppelin/cairo-contracts", tag = "v3.0.0-alpha.3" } [lib] diff --git a/packages/ui/api/ai-assistant/function-definitions/cairo-alpha-shared.ts b/packages/ui/api/ai-assistant/function-definitions/cairo-alpha-shared.ts index 0112678a8..aaa86dc6a 100644 --- a/packages/ui/api/ai-assistant/function-definitions/cairo-alpha-shared.ts +++ b/packages/ui/api/ai-assistant/function-definitions/cairo-alpha-shared.ts @@ -3,6 +3,7 @@ import type { CairoAlphaCommonContractOptions, CairoAlphaRoyaltyInfoOptions } fr import { infoDescriptions } from '../../../../common/src/ai/descriptions/common.ts'; import { cairoCommonDescriptions, + cairoMacrosDescriptions, cairoAlphaAccessDescriptions, cairoRoyaltyInfoDescriptions, } from '../../../../common/src/ai/descriptions/cairo.ts'; @@ -29,6 +30,17 @@ const commonContractFunctionDescription = { }, }, + macros: { + type: 'object', + description: cairoMacrosDescriptions.macros, + properties: { + withComponents: { + type: 'boolean', + description: cairoMacrosDescriptions.withComponents, + }, + }, + }, + access: { type: 'object', properties: { diff --git a/packages/ui/api/ai-assistant/function-definitions/cairo-alpha.ts b/packages/ui/api/ai-assistant/function-definitions/cairo-alpha.ts index 0940c1a01..760bc3058 100644 --- a/packages/ui/api/ai-assistant/function-definitions/cairo-alpha.ts +++ b/packages/ui/api/ai-assistant/function-definitions/cairo-alpha.ts @@ -27,6 +27,7 @@ export const cairoAlphaERC20AIFunctionDefinition = { 'access', 'upgradeable', 'info', + 'macros', 'appName', 'appVersion', ]), @@ -63,6 +64,7 @@ export const cairoAlphaERC721AIFunctionDefinition = { 'mintable', 'upgradeable', 'info', + 'macros', 'royaltyInfo', 'appName', 'appVersion', @@ -96,6 +98,7 @@ export const cairoAlphaERC1155AIFunctionDefinition = { 'access', 'upgradeable', 'info', + 'macros', 'royaltyInfo', ]), baseUri: { @@ -122,6 +125,7 @@ export const cairoAlphaGovernorAIFunctionDefinition = { 'name', 'upgradeable', 'info', + 'macros', 'appName', 'appVersion', ]), @@ -187,7 +191,7 @@ export const cairoAlphaVestingAIFunctionDefinition = { parameters: { type: 'object', properties: { - ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'info']), + ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'info', 'macros']), startDate: { type: 'string', description: cairoVestingDescriptions.startDate, @@ -217,7 +221,7 @@ export const cairoAlphaAccountAIFunctionDefinition = { parameters: { type: 'object', properties: { - ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'upgradeable', 'info']), + ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'upgradeable', 'info', 'macros']), type: { type: 'string', enum: ['stark', 'eth'], @@ -245,7 +249,7 @@ export const cairoAlphaMultisigAIFunctionDefinition = { parameters: { type: 'object', properties: { - ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'upgradeable', 'info']), + ...addFunctionPropertiesFrom(cairoAlphaSharedFunctionDefinition, ['name', 'upgradeable', 'info', 'macros']), quorum: { type: 'string', description: cairoMultisigDescriptions.quorum, @@ -268,6 +272,7 @@ export const cairoAlphaCustomAIFunctionDefinition = { 'access', 'upgradeable', 'info', + 'macros', ]), }, required: ['name'], diff --git a/packages/ui/src/cairo_alpha/AccountControls.svelte b/packages/ui/src/cairo_alpha/AccountControls.svelte index 3c55ad975..cf5c9d37e 100644 --- a/packages/ui/src/cairo_alpha/AccountControls.svelte +++ b/packages/ui/src/cairo_alpha/AccountControls.svelte @@ -1,15 +1,17 @@ + +
+

+
+ Macros + + In order to compile Cairo contracts with macros enabled, you need to have the Rust toolchain installed and openzeppelin_macros package added as a dependency. + +
+

+ +
+ +
+
diff --git a/packages/ui/src/cairo_alpha/MultisigControls.svelte b/packages/ui/src/cairo_alpha/MultisigControls.svelte index 51cedf249..2529b7469 100644 --- a/packages/ui/src/cairo_alpha/MultisigControls.svelte +++ b/packages/ui/src/cairo_alpha/MultisigControls.svelte @@ -2,10 +2,11 @@ import HelpTooltip from '../common/HelpTooltip.svelte'; import UpgradeabilityField from './UpgradeabilityField.svelte'; - import type { KindedOptions, OptionsErrorMessages } from '@openzeppelin/wizard-cairo'; - import { multisig, infoDefaults } from '@openzeppelin/wizard-cairo'; + import type { KindedOptions, OptionsErrorMessages } from '@openzeppelin/wizard-cairo-alpha'; + import { multisig, infoDefaults, macrosDefaults } from '@openzeppelin/wizard-cairo-alpha'; import InfoSection from './InfoSection.svelte'; + import MacrosSection from './MacrosSection.svelte'; import { error } from '../common/error-tooltip'; const defaults = multisig.defaults; @@ -14,6 +15,7 @@ kind: 'Multisig', ...defaults, info: { ...infoDefaults }, // create new object since Info is nested + macros: { ...macrosDefaults }, // create new object since MacrosOptions is nested }; export let errors: undefined | OptionsErrorMessages; @@ -45,4 +47,6 @@ + + diff --git a/packages/ui/src/cairo_alpha/VestingControls.svelte b/packages/ui/src/cairo_alpha/VestingControls.svelte index b78fc5ff5..80807de00 100644 --- a/packages/ui/src/cairo_alpha/VestingControls.svelte +++ b/packages/ui/src/cairo_alpha/VestingControls.svelte @@ -2,15 +2,17 @@ import HelpTooltip from '../common/HelpTooltip.svelte'; import type { KindedOptions, OptionsErrorMessages } from '@openzeppelin/wizard-cairo-alpha'; - import { vesting, infoDefaults } from '@openzeppelin/wizard-cairo-alpha'; + import { vesting, infoDefaults, macrosDefaults } from '@openzeppelin/wizard-cairo-alpha'; import InfoSection from './InfoSection.svelte'; + import MacrosSection from './MacrosSection.svelte'; import { error } from '../common/error-tooltip'; export let opts: Required = { kind: 'Vesting', ...vesting.defaults, info: { ...infoDefaults }, // create new object since Info is nested + macros: { ...macrosDefaults }, // create new object since MacrosOptions is nested }; export let errors: undefined | OptionsErrorMessages; @@ -71,4 +73,6 @@ + +