diff --git a/packages/core-cairo/CHANGELOG.md b/packages/core-cairo/CHANGELOG.md index d313b129..a54fc197 100644 --- a/packages/core-cairo/CHANGELOG.md +++ b/packages/core-cairo/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.10.1 (2024-03-27) + +- Use mixins. ([#348](https://github.com/OpenZeppelin/contracts-wizard/pull/348)) + ## 0.10.0 (2024-03-12) - **Breaking changes**: diff --git a/packages/core-cairo/package.json b/packages/core-cairo/package.json index e1253a8a..42577228 100644 --- a/packages/core-cairo/package.json +++ b/packages/core-cairo/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/wizard-cairo", - "version": "0.10.0", + "version": "0.10.1", "description": "A boilerplate generator to get started with OpenZeppelin Contracts for Cairo", "license": "MIT", "repository": "github:OpenZeppelin/contracts-wizard", diff --git a/packages/core-cairo/src/common-components.ts b/packages/core-cairo/src/common-components.ts index dff26e48..dc90090a 100644 --- a/packages/core-cairo/src/common-components.ts +++ b/packages/core-cairo/src/common-components.ts @@ -12,15 +12,18 @@ const components = defineComponents( { name: 'SRC5Event', type: 'SRC5Component::Event', }, - impls: [ - { - name: 'SRC5Impl', - value: 'SRC5Component::SRC5Impl', - }, - ], + impls: [], }, }) export function addSRC5Component(c: ContractBuilder) { c.addComponent(components.SRC5Component, [], false); + + if (!c.interfaceFlags.has('ISRC5')) { + c.addImplToComponent(components.SRC5Component, { + name: 'SRC5Impl', + value: 'SRC5Component::SRC5Impl', + }); + c.addInterfaceFlag('ISRC5'); + } } \ No newline at end of file diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index 8eba5d33..751f99e3 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -89,6 +89,7 @@ export class ContractBuilder implements Contract { private implementedTraitsMap: Map = new Map(); private superVariablesMap: Map = new Map(); private standaloneImportsSet: Set = new Set(); + private interfaceFlagsSet: Set = new Set(); constructor(name: string) { this.name = toIdentifier(name, true); @@ -110,6 +111,13 @@ export class ContractBuilder implements Contract { return [...this.standaloneImportsSet]; } + /** + * Custom flags to denote that the contract implements a specific interface, e.g. ISRC5, to avoid duplicates + **/ + get interfaceFlags(): Set { + return this.interfaceFlagsSet; + } + addStandaloneImport(fullyQualified: string) { this.standaloneImportsSet.add(fullyQualified); } @@ -208,4 +216,8 @@ export class ContractBuilder implements Contract { addConstructorCode(code: string) { this.constructorCode.push(code); } + + addInterfaceFlag(flag: string) { + this.interfaceFlagsSet.add(flag); + } } diff --git a/packages/core-cairo/src/custom.test.ts.md b/packages/core-cairo/src/custom.test.ts.md index 68b1a8e6..72b3bfba 100644 --- a/packages/core-cairo/src/custom.test.ts.md +++ b/packages/core-cairo/src/custom.test.ts.md @@ -38,9 +38,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -104,9 +102,7 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -173,9 +169,7 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ ␊ @@ -217,11 +211,7 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ #[abi(embed_v0)]␊ - impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ - #[abi(embed_v0)]␊ - impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ ␊ @@ -270,9 +260,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ diff --git a/packages/core-cairo/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index 48e84d6a..0abf2705 100644 Binary files a/packages/core-cairo/src/custom.test.ts.snap and b/packages/core-cairo/src/custom.test.ts.snap differ diff --git a/packages/core-cairo/src/erc20.test.ts.md b/packages/core-cairo/src/erc20.test.ts.md index bee9f2b3..61617457 100644 --- a/packages/core-cairo/src/erc20.test.ts.md +++ b/packages/core-cairo/src/erc20.test.ts.md @@ -18,11 +18,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ - #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ ␊ @@ -61,11 +57,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ - #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ ␊ @@ -123,9 +115,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ @@ -262,11 +252,7 @@ Generated by [AVA](https://avajs.dev). #[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 SRC5Impl = SRC5Component::SRC5Impl;␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ @@ -405,9 +391,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ @@ -536,11 +520,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ - #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ ␊ @@ -580,11 +560,7 @@ Generated by [AVA](https://avajs.dev). component!(path: ERC20Component, storage: erc20, event: ERC20Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ - #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ ␊ @@ -625,15 +601,9 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -696,17 +666,9 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC20MetadataImpl = ERC20Component::ERC20MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC20Impl = ERC20Component::ERC20Impl;␊ - #[abi(embed_v0)]␊ - impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ - #[abi(embed_v0)]␊ - impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl;␊ + impl ERC20MixinImpl = ERC20Component::ERC20ABI;␊ #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl;␊ @@ -782,9 +744,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ @@ -957,11 +917,7 @@ Generated by [AVA](https://avajs.dev). #[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 SRC5Impl = SRC5Component::SRC5Impl;␊ + impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl;␊ ␊ impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index 63b18875..83514ebd 100644 Binary files a/packages/core-cairo/src/erc20.test.ts.snap and b/packages/core-cairo/src/erc20.test.ts.snap differ diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index b538f1df..1ea8b39b 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -58,7 +58,7 @@ export function buildERC20(opts: ERC20Options): Contract { const allOpts = withDefaults(opts); addBase(c, toStringLiteral(allOpts.name), toStringLiteral(allOpts.symbol)); - addERC20ImplAndCamelOnlyImpl(c, allOpts.pausable); + addERC20MixinOrImpls(c, allOpts.pausable); if (allOpts.premint) { addPremint(c, allOpts.premint); @@ -93,10 +93,15 @@ function addERC20Interface(c: ContractBuilder) { c.addStandaloneImport('openzeppelin::token::erc20::interface'); } -function addERC20ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { +function addERC20MixinOrImpls(c: ContractBuilder, pausable: boolean) { if (pausable) { addERC20Interface(c); + c.addImplToComponent(components.ERC20Component, { + name: 'ERC20MetadataImpl', + value: 'ERC20Component::ERC20MetadataImpl', + }); + const ERC20Impl: BaseImplementedTrait = { name: 'ERC20Impl', of: 'interface::IERC20', @@ -123,12 +128,8 @@ function addERC20ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { setPausable(c, ERC20CamelOnlyImpl, functions.transferFrom); } else { c.addImplToComponent(components.ERC20Component, { - name: 'ERC20Impl', - value: 'ERC20Component::ERC20Impl', - }); - c.addImplToComponent(components.ERC20Component, { - name: 'ERC20CamelOnlyImpl', - value: 'ERC20Component::ERC20CamelOnlyImpl', + name: 'ERC20MixinImpl', + value: 'ERC20Component::ERC20ABI', }); } } @@ -223,12 +224,7 @@ const components = defineComponents( { name: 'ERC20Event', type: 'ERC20Component::Event', }, - impls: [ - { - name: 'ERC20MetadataImpl', - value: 'ERC20Component::ERC20MetadataImpl', - }, - ], + impls: [], internalImpl: { name: 'ERC20InternalImpl', value: 'ERC20Component::InternalImpl', diff --git a/packages/core-cairo/src/erc721.test.ts.md b/packages/core-cairo/src/erc721.test.ts.md index 89a738d9..f2914150 100644 --- a/packages/core-cairo/src/erc721.test.ts.md +++ b/packages/core-cairo/src/erc721.test.ts.md @@ -20,15 +20,7 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721MetadataCamelOnly = ERC721Component::ERC721MetadataCamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721Impl = ERC721Component::ERC721Impl;␊ - #[abi(embed_v0)]␊ - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ ␊ @@ -72,15 +64,7 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721MetadataCamelOnly = ERC721Component::ERC721MetadataCamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721Impl = ERC721Component::ERC721Impl;␊ - #[abi(embed_v0)]␊ - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ ␊ @@ -125,15 +109,7 @@ Generated by [AVA](https://avajs.dev). component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ ␊ #[abi(embed_v0)]␊ - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721MetadataCamelOnly = ERC721Component::ERC721MetadataCamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721Impl = ERC721Component::ERC721Impl;␊ - #[abi(embed_v0)]␊ - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ ␊ @@ -202,9 +178,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ @@ -373,19 +347,9 @@ Generated by [AVA](https://avajs.dev). component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ #[abi(embed_v0)]␊ - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721MetadataCamelOnly = ERC721Component::ERC721MetadataCamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721Impl = ERC721Component::ERC721Impl;␊ - #[abi(embed_v0)]␊ - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl;␊ @@ -467,15 +431,7 @@ Generated by [AVA](https://avajs.dev). component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ ␊ #[abi(embed_v0)]␊ - impl ERC721MetadataImpl = ERC721Component::ERC721MetadataImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721MetadataCamelOnly = ERC721Component::ERC721MetadataCamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl ERC721Impl = ERC721Component::ERC721Impl;␊ - #[abi(embed_v0)]␊ - impl ERC721CamelOnly = ERC721Component::ERC721CamelOnlyImpl;␊ - #[abi(embed_v0)]␊ - impl SRC5Impl = SRC5Component::SRC5Impl;␊ + impl ERC721MixinImpl = ERC721Component::ERC721MixinImpl;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl;␊ #[abi(embed_v0)]␊ @@ -576,9 +532,7 @@ Generated by [AVA](https://avajs.dev). #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl;␊ #[abi(embed_v0)]␊ - impl OwnableImpl = OwnableComponent::OwnableImpl;␊ - #[abi(embed_v0)]␊ - impl OwnableCamelOnlyImpl = OwnableComponent::OwnableCamelOnlyImpl;␊ + impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl;␊ ␊ impl ERC721InternalImpl = ERC721Component::InternalImpl;␊ impl PausableInternalImpl = PausableComponent::InternalImpl;␊ diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index dd8e7136..d077e0cc 100644 Binary files a/packages/core-cairo/src/erc721.test.ts.snap and b/packages/core-cairo/src/erc721.test.ts.snap differ diff --git a/packages/core-cairo/src/erc721.ts b/packages/core-cairo/src/erc721.ts index fb5bd6d5..658ba5a4 100644 --- a/packages/core-cairo/src/erc721.ts +++ b/packages/core-cairo/src/erc721.ts @@ -58,7 +58,8 @@ export function buildERC721(opts: ERC721Options): Contract { const allOpts = withDefaults(opts); addBase(c, toStringLiteral(allOpts.name), toStringLiteral(allOpts.symbol), toStringLiteral(allOpts.baseUri)); - addERC721ImplAndCamelOnlyImpl(c, allOpts.pausable); + addERC721MixinOrImpls(c, allOpts.pausable); + addSRC5Component(c); if (allOpts.pausable) { addPausable(c, allOpts.access); @@ -89,10 +90,19 @@ function addERC721Interface(c: ContractBuilder) { c.addStandaloneImport('openzeppelin::token::erc721::interface'); } -function addERC721ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { +function addERC721MixinOrImpls(c: ContractBuilder, pausable: boolean) { if (pausable) { addERC721Interface(c); + c.addImplToComponent(components.ERC721Component, { + name: 'ERC721MetadataImpl', + value: 'ERC721Component::ERC721MetadataImpl', + }); + c.addImplToComponent(components.ERC721Component, { + name: 'ERC721MetadataCamelOnly', + value: 'ERC721Component::ERC721MetadataCamelOnlyImpl', + }); + const ERC721Impl: BaseImplementedTrait = { name: 'ERC721Impl', of: 'interface::IERC721', @@ -125,13 +135,10 @@ function addERC721ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { c.addFunction(ERC721CamelOnlyImpl, functions.isApprovedForAll); } else { c.addImplToComponent(components.ERC721Component, { - name: 'ERC721Impl', - value: 'ERC721Component::ERC721Impl', - }); - c.addImplToComponent(components.ERC721Component, { - name: 'ERC721CamelOnly', - value: 'ERC721Component::ERC721CamelOnlyImpl', + name: 'ERC721MixinImpl', + value: 'ERC721Component::ERC721MixinImpl', }); + c.addInterfaceFlag('ISRC5'); } } @@ -143,7 +150,6 @@ function addBase(c: ContractBuilder, name: string, symbol: string, baseUri: stri ], true, ); - addSRC5Component(c); } function addBurnable(c: ContractBuilder) { @@ -170,16 +176,7 @@ const components = defineComponents( { name: 'ERC721Event', type: 'ERC721Component::Event', }, - impls: [ - { - name: 'ERC721MetadataImpl', - value: 'ERC721Component::ERC721MetadataImpl', - }, - { - name: 'ERC721MetadataCamelOnly', - value: 'ERC721Component::ERC721MetadataCamelOnlyImpl', - } - ], + impls: [], internalImpl: { name: 'ERC721InternalImpl', value: 'ERC721Component::InternalImpl', diff --git a/packages/core-cairo/src/set-access-control.ts b/packages/core-cairo/src/set-access-control.ts index 26be1e80..e3a7130d 100644 --- a/packages/core-cairo/src/set-access-control.ts +++ b/packages/core-cairo/src/set-access-control.ts @@ -21,6 +21,22 @@ export type Access = typeof accessOptions[number]; } case 'roles': { if (c.addComponent(components.AccessControlComponent, [], true)) { + if (c.interfaceFlags.has('ISRC5')) { + c.addImplToComponent(components.AccessControlComponent, { + name: 'AccessControlImpl', + value: 'AccessControlComponent::AccessControlImpl', + }); + c.addImplToComponent(components.AccessControlComponent, { + name: 'AccessControlCamelImpl', + value: 'AccessControlComponent::AccessControlCamelImpl', + }); + } else { + c.addImplToComponent(components.AccessControlComponent, { + name: 'AccessControlMixinImpl', + value: 'AccessControlComponent::AccessControlMixinImpl', + }); + c.addInterfaceFlag('ISRC5'); + } addSRC5Component(c); c.addStandaloneImport('starknet::ContractAddress'); @@ -80,13 +96,9 @@ const components = defineComponents( { }, impls: [ { - name: 'OwnableImpl', - value: 'OwnableComponent::OwnableImpl', + name: 'OwnableMixinImpl', + value: 'OwnableComponent::OwnableMixinImpl', }, - { - name: 'OwnableCamelOnlyImpl', - value: 'OwnableComponent::OwnableCamelOnlyImpl', - }, ], internalImpl: { name: 'OwnableInternalImpl', @@ -103,16 +115,7 @@ const components = defineComponents( { name: 'AccessControlEvent', type: 'AccessControlComponent::Event', }, - impls: [ - { - name: 'AccessControlImpl', - value: 'AccessControlComponent::AccessControlImpl', - }, - { - name: 'AccessControlCamelImpl', - value: 'AccessControlComponent::AccessControlCamelImpl', - }, - ], + impls: [], internalImpl: { name: 'AccessControlInternalImpl', value: 'AccessControlComponent::InternalImpl',