diff --git a/LICENSE b/LICENSE index 0fcfda821..00501370f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2021-2023 zOS Global Limited and contributors +Copyright (c) 2021-2024 zOS Global Limited and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/packages/core-cairo/CHANGELOG.md b/packages/core-cairo/CHANGELOG.md index 8f1f01474..e4238029d 100644 --- a/packages/core-cairo/CHANGELOG.md +++ b/packages/core-cairo/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## 0.9.0 (2024-02-12) + +- **Breaking changes**: + - Remove non-standard `safeAllowance` option from ERC20. ([#324](https://github.com/OpenZeppelin/contracts-wizard/pull/324)) + - Use `abi(embed_v0)` attribute instead of `external` for impls derived from interfaces. + - Use `abi(per_item)` attribute instead of `external` for impls with generated traits. + ## 0.8.0 (2023-12-11) - **Breaking changes**: diff --git a/packages/core-cairo/package.json b/packages/core-cairo/package.json index b395a2518..4a83d5bb4 100644 --- a/packages/core-cairo/package.json +++ b/packages/core-cairo/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/wizard-cairo", - "version": "0.8.0", + "version": "0.9.0", "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/contract.test.ts b/packages/core-cairo/src/contract.test.ts index ef3c0757f..1cc88ba8d 100644 --- a/packages/core-cairo/src/contract.test.ts +++ b/packages/core-cairo/src/contract.test.ts @@ -49,9 +49,10 @@ test('contract with function code before', t => { name: 'External', of: 'ExternalTrait', tags: [ - '#[generate_trait]', - '#[external(v0)]' + 'generate_trait', + 'abi(per_item)', ], + perItemTag: 'external(v0)', }; Foo.addImplementedTrait(trait); const fn: BaseFunction = { @@ -72,9 +73,10 @@ test('contract with function code before with semicolons', t => { name: 'External', of: 'ExternalTrait', tags: [ - '#[generate_trait]', - '#[external(v0)]' + 'generate_trait', + 'abi(per_item)', ], + perItemTag: 'external(v0)', }; Foo.addImplementedTrait(trait); const fn: BaseFunction = { diff --git a/packages/core-cairo/src/contract.test.ts.md b/packages/core-cairo/src/contract.test.ts.md index d33d3b486..e0cf8fc3c 100644 --- a/packages/core-cairo/src/contract.test.ts.md +++ b/packages/core-cairo/src/contract.test.ts.md @@ -69,8 +69,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl External of ExternalTrait {␊ + #[external(v0)]␊ fn someFunction() {␊ before();␊ someFunction();␊ @@ -92,8 +93,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl External of ExternalTrait {␊ + #[external(v0)]␊ fn someFunction() {␊ before();␊ someFunction();␊ diff --git a/packages/core-cairo/src/contract.test.ts.snap b/packages/core-cairo/src/contract.test.ts.snap index 1a82b9125..d377c7346 100644 Binary files a/packages/core-cairo/src/contract.test.ts.snap and b/packages/core-cairo/src/contract.test.ts.snap differ diff --git a/packages/core-cairo/src/contract.ts b/packages/core-cairo/src/contract.ts index a61cf35e4..8eba5d333 100644 --- a/packages/core-cairo/src/contract.ts +++ b/packages/core-cairo/src/contract.ts @@ -47,6 +47,7 @@ export interface BaseImplementedTrait { name: string; of: string; tags: string[]; + perItemTag?: string; } export interface ImplementedTrait extends BaseImplementedTrait { @@ -62,6 +63,7 @@ export interface BaseFunction { export interface ContractFunction extends BaseFunction { codeBefore?: string[]; + tag?: string; } export interface Variable { @@ -178,6 +180,7 @@ export class ContractBuilder implements Contract { const contractFn: ContractFunction = { ...fn, codeBefore: [], + tag: baseTrait.perItemTag, }; t.functions.push(contractFn); return contractFn; diff --git a/packages/core-cairo/src/custom.test.ts.md b/packages/core-cairo/src/custom.test.ts.md index 47234ec1d..3b28db391 100644 --- a/packages/core-cairo/src/custom.test.ts.md +++ b/packages/core-cairo/src/custom.test.ts.md @@ -66,13 +66,15 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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();␊ @@ -128,7 +130,7 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ @@ -291,13 +293,15 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index bd8639bca..d4c8e6484 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 b/packages/core-cairo/src/erc20.test.ts index 27404f99a..87e9776ea 100644 --- a/packages/core-cairo/src/erc20.test.ts +++ b/packages/core-cairo/src/erc20.test.ts @@ -68,17 +68,12 @@ testERC20('erc20 mintable with roles', { access: 'roles', }); -testERC20('erc20 safe allowance', { - safeAllowance: true, -}); - testERC20('erc20 full upgradeable', { premint: '2000', access: 'ownable', burnable: true, mintable: true, pausable: true, - safeAllowance: true, upgradeable: true, }); @@ -88,7 +83,6 @@ testERC20('erc20 full upgradeable with roles', { burnable: true, mintable: true, pausable: true, - safeAllowance: true, upgradeable: true, }); @@ -104,7 +98,6 @@ testAPIEquivalence('erc20 API full upgradeable', { burnable: true, mintable: true, pausable: true, - safeAllowance: true, upgradeable: true, }); diff --git a/packages/core-cairo/src/erc20.test.ts.md b/packages/core-cairo/src/erc20.test.ts.md index f9ce8e885..176874472 100644 --- a/packages/core-cairo/src/erc20.test.ts.md +++ b/packages/core-cairo/src/erc20.test.ts.md @@ -86,8 +86,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn burn(ref self: ContractState, value: u256) {␊ let caller = get_caller_address();␊ self.erc20._burn(caller, value);␊ @@ -154,7 +155,7 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20Impl of interface::IERC20 {␊ fn total_supply(self: @ContractState) -> u256 {␊ self.erc20.total_supply()␊ @@ -189,7 +190,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20CamelOnlyImpl of interface::IERC20CamelOnly {␊ fn totalSupply(self: @ContractState) -> u256 {␊ self.total_supply()␊ @@ -211,13 +212,15 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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();␊ @@ -299,7 +302,7 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20Impl of interface::IERC20 {␊ fn total_supply(self: @ContractState) -> u256 {␊ self.erc20.total_supply()␊ @@ -334,7 +337,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20CamelOnlyImpl of interface::IERC20CamelOnly {␊ fn totalSupply(self: @ContractState) -> u256 {␊ self.total_supply()␊ @@ -356,13 +359,15 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn pause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable._pause();␊ }␊ ␊ + #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable._unpause();␊ @@ -430,7 +435,7 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20Impl of interface::IERC20 {␊ fn total_supply(self: @ContractState) -> u256 {␊ self.erc20.total_supply()␊ @@ -465,7 +470,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20CamelOnlyImpl of interface::IERC20CamelOnly {␊ fn totalSupply(self: @ContractState) -> u256 {␊ self.total_supply()␊ @@ -487,18 +492,21 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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.pausable.assert_not_paused();␊ let caller = get_caller_address();␊ @@ -646,8 +654,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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);␊ @@ -724,8 +733,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc20._mint(recipient, amount);␊ @@ -734,51 +744,6 @@ Generated by [AVA](https://avajs.dev). }␊ ` -## erc20 safe allowance - -> Snapshot 1 - - `// SPDX-License-Identifier: MIT␊ - ␊ - #[starknet::contract]␊ - mod MyToken {␊ - use openzeppelin::token::erc20::ERC20Component;␊ - ␊ - 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;␊ - #[abi(embed_v0)]␊ - impl SafeAllowanceImpl = ERC20Component::SafeAllowanceImpl;␊ - #[abi(embed_v0)]␊ - impl SafeAllowanceCamelImpl = ERC20Component::SafeAllowanceCamelImpl;␊ - ␊ - impl ERC20InternalImpl = ERC20Component::InternalImpl;␊ - ␊ - #[storage]␊ - struct Storage {␊ - #[substorage(v0)]␊ - erc20: ERC20Component::Storage,␊ - }␊ - ␊ - #[event]␊ - #[derive(Drop, starknet::Event)]␊ - enum Event {␊ - #[flat]␊ - ERC20Event: ERC20Component::Event,␊ - }␊ - ␊ - #[constructor]␊ - fn constructor(ref self: ContractState) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ - }␊ - }␊ - ` - ## erc20 full upgradeable > Snapshot 1 @@ -849,7 +814,7 @@ Generated by [AVA](https://avajs.dev). self.erc20._mint(recipient, 2000000000000000000000);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20Impl of interface::IERC20 {␊ fn total_supply(self: @ContractState) -> u256 {␊ self.erc20.total_supply()␊ @@ -884,7 +849,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20CamelOnlyImpl of interface::IERC20CamelOnly {␊ fn totalSupply(self: @ContractState) -> u256 {␊ self.total_supply()␊ @@ -904,52 +869,30 @@ Generated by [AVA](https://avajs.dev). self.transfer_from(sender, recipient, amount)␊ }␊ }␊ - ␊ - #[external(v0)]␊ - impl SafeAllowanceImpl of interface::ISafeAllowance {␊ - fn increase_allowance(ref self: ContractState, spender: ContractAddress, added_value: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.erc20.increase_allowance(spender, added_value)␊ - }␊ - ␊ - fn decrease_allowance(ref self: ContractState, spender: ContractAddress, subtracted_value: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.erc20.decrease_allowance(spender, subtracted_value)␊ - }␊ - }␊ - ␊ - #[external(v0)]␊ - impl SafeAllowanceCamelImpl of interface::ISafeAllowanceCamel {␊ - fn increaseAllowance(ref self: ContractState, spender: ContractAddress, addedValue: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.increase_allowance(spender, addedValue)␊ - }␊ - ␊ - fn decreaseAllowance(ref self: ContractState, spender: ContractAddress, subtractedValue: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.decrease_allowance(spender, subtractedValue)␊ - }␊ - }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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.pausable.assert_not_paused();␊ let caller = get_caller_address();␊ self.erc20._burn(caller, value);␊ }␊ ␊ + #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ self.ownable.assert_only_owner();␊ self.pausable.assert_not_paused();␊ @@ -957,7 +900,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ @@ -1062,7 +1005,7 @@ Generated by [AVA](https://avajs.dev). self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20Impl of interface::IERC20 {␊ fn total_supply(self: @ContractState) -> u256 {␊ self.erc20.total_supply()␊ @@ -1097,7 +1040,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC20CamelOnlyImpl of interface::IERC20CamelOnly {␊ fn totalSupply(self: @ContractState) -> u256 {␊ self.total_supply()␊ @@ -1117,52 +1060,30 @@ Generated by [AVA](https://avajs.dev). self.transfer_from(sender, recipient, amount)␊ }␊ }␊ - ␊ - #[external(v0)]␊ - impl SafeAllowanceImpl of interface::ISafeAllowance {␊ - fn increase_allowance(ref self: ContractState, spender: ContractAddress, added_value: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.erc20.increase_allowance(spender, added_value)␊ - }␊ - ␊ - fn decrease_allowance(ref self: ContractState, spender: ContractAddress, subtracted_value: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.erc20.decrease_allowance(spender, subtracted_value)␊ - }␊ - }␊ - ␊ - #[external(v0)]␊ - impl SafeAllowanceCamelImpl of interface::ISafeAllowanceCamel {␊ - fn increaseAllowance(ref self: ContractState, spender: ContractAddress, addedValue: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.increase_allowance(spender, addedValue)␊ - }␊ - ␊ - fn decreaseAllowance(ref self: ContractState, spender: ContractAddress, subtractedValue: u256) -> bool {␊ - self.pausable.assert_not_paused();␊ - self.decrease_allowance(spender, subtractedValue)␊ - }␊ - }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn pause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable._pause();␊ }␊ ␊ + #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable._unpause();␊ }␊ ␊ + #[external(v0)]␊ fn burn(ref self: ContractState, value: u256) {␊ self.pausable.assert_not_paused();␊ let caller = get_caller_address();␊ self.erc20._burn(caller, value);␊ }␊ ␊ + #[external(v0)]␊ fn mint(ref self: ContractState, recipient: ContractAddress, amount: u256) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.pausable.assert_not_paused();␊ @@ -1170,7 +1091,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index becbd01c4..f460aae84 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 81f609ba2..a1665d917 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -19,7 +19,6 @@ export const defaults: Required = { pausable: false, premint: '0', mintable: false, - safeAllowance: false, access: commonDefaults.access, upgradeable: commonDefaults.upgradeable, info: commonDefaults.info @@ -36,7 +35,6 @@ export interface ERC20Options extends CommonOptions { pausable?: boolean; premint?: string; mintable?: boolean; - safeAllowance?: boolean; } function withDefaults(opts: ERC20Options): Required { @@ -47,7 +45,6 @@ function withDefaults(opts: ERC20Options): Required { pausable: opts.pausable ?? defaults.pausable, premint: opts.premint || defaults.premint, mintable: opts.mintable ?? defaults.mintable, - safeAllowance: opts.safeAllowance ?? defaults.safeAllowance, }; } @@ -63,10 +60,6 @@ export function buildERC20(opts: ERC20Options): Contract { addBase(c, toShortString(allOpts.name, 'name'), toShortString(allOpts.symbol, 'symbol')); addERC20ImplAndCamelOnlyImpl(c, allOpts.pausable); - if (allOpts.safeAllowance) { - addSafeAllowance(c, allOpts.pausable); - } - if (allOpts.premint) { addPremint(c, allOpts.premint); } @@ -108,7 +101,7 @@ function addERC20ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { name: 'ERC20Impl', of: 'interface::IERC20', tags: [ - '#[external(v0)]' + 'abi(embed_v0)' ], } c.addFunction(ERC20Impl, functions.total_supply); @@ -122,7 +115,7 @@ function addERC20ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { name: 'ERC20CamelOnlyImpl', of: 'interface::IERC20CamelOnly', tags: [ - '#[external(v0)]' + 'abi(embed_v0)' ], } c.addFunction(ERC20CamelOnlyImpl, functions.totalSupply); @@ -150,45 +143,6 @@ function addBase(c: ContractBuilder, name: string, symbol: string) { ); } -function addSafeAllowance(c: ContractBuilder, pausable: boolean) { - if (pausable) { - addERC20Interface(c); - - const SafeAllowanceImpl: BaseImplementedTrait = { - name: 'SafeAllowanceImpl', - of: 'interface::ISafeAllowance', - tags: [ - '#[external(v0)]' - ], - } - setPausable(c, SafeAllowanceImpl, functions.increase_allowance); - setPausable(c, SafeAllowanceImpl, functions.decrease_allowance); - - const SafeAllowanceCamelImpl: BaseImplementedTrait = { - name: 'SafeAllowanceCamelImpl', - of: 'interface::ISafeAllowanceCamel', - tags: [ - '#[external(v0)]' - ], - } - setPausable(c, SafeAllowanceCamelImpl, functions.increaseAllowance); - setPausable(c, SafeAllowanceCamelImpl, functions.decreaseAllowance); - } else { - c.addImplToComponent(components.ERC20Component, - { - name: 'SafeAllowanceImpl', - value: 'ERC20Component::SafeAllowanceImpl', - }, - ); - c.addImplToComponent(components.ERC20Component, - { - name: 'SafeAllowanceCamelImpl', - value: 'ERC20Component::SafeAllowanceCamelImpl', - }, - ); - } -} - function addBurnable(c: ContractBuilder) { c.addStandaloneImport('starknet::get_caller_address'); c.addFunction(externalTrait, functions.burn); @@ -402,52 +356,4 @@ const functions = defineFunctions({ ], returns : 'bool', }, - - // Re-implements SafeAllowanceImpl - increase_allowance: { - args: [ - getSelfArg(), - { name: 'spender', type: 'ContractAddress' }, - { name: 'added_value', type: 'u256' }, - ], - code: [ - 'self.erc20.increase_allowance(spender, added_value)' - ], - returns : 'bool', - }, - decrease_allowance: { - args: [ - getSelfArg(), - { name: 'spender', type: 'ContractAddress' }, - { name: 'subtracted_value', type: 'u256' }, - ], - code: [ - 'self.erc20.decrease_allowance(spender, subtracted_value)' - ], - returns : 'bool', - }, - - // Re-implements SafeAllowanceCamelImpl - increaseAllowance: { - args: [ - getSelfArg(), - { name: 'spender', type: 'ContractAddress' }, - { name: 'addedValue', type: 'u256' }, - ], - code: [ - 'self.increase_allowance(spender, addedValue)' - ], - returns : 'bool', - }, - decreaseAllowance: { - args: [ - getSelfArg(), - { name: 'spender', type: 'ContractAddress' }, - { name: 'subtractedValue', type: 'u256' }, - ], - code: [ - 'self.decrease_allowance(spender, subtractedValue)' - ], - returns : 'bool', - }, }); diff --git a/packages/core-cairo/src/erc721.test.ts.md b/packages/core-cairo/src/erc721.test.ts.md index dccc4c347..891145193 100644 --- a/packages/core-cairo/src/erc721.test.ts.md +++ b/packages/core-cairo/src/erc721.test.ts.md @@ -106,8 +106,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn burn(ref self: ContractState, token_id: u256) {␊ let caller = get_caller_address();␊ assert(self.erc721._is_approved_or_owner(caller, token_id), ERC721Component::Errors::UNAUTHORIZED);␊ @@ -185,7 +186,7 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC721Impl of interface::IERC721 {␊ fn balance_of(self: @ContractState, account: ContractAddress) -> u256 {␊ self.erc721.balance_of(account)␊ @@ -235,7 +236,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC721CamelOnlyImpl of interface::IERC721CamelOnly {␊ fn balanceOf(self: @ContractState, account: ContractAddress) -> u256 {␊ self.balance_of(account)␊ @@ -281,13 +282,15 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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();␊ @@ -359,8 +362,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn safe_mint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -373,6 +377,7 @@ Generated by [AVA](https://avajs.dev). self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ + #[external(v0)]␊ fn safeMint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -456,8 +461,9 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ + #[external(v0)]␊ fn safe_mint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -470,6 +476,7 @@ Generated by [AVA](https://avajs.dev). self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ + #[external(v0)]␊ fn safeMint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -561,7 +568,7 @@ Generated by [AVA](https://avajs.dev). self.ownable.initializer(owner);␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC721Impl of interface::IERC721 {␊ fn balance_of(self: @ContractState, account: ContractAddress) -> u256 {␊ self.erc721.balance_of(account)␊ @@ -611,7 +618,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl ERC721CamelOnlyImpl of interface::IERC721CamelOnly {␊ fn balanceOf(self: @ContractState, account: ContractAddress) -> u256 {␊ self.balance_of(account)␊ @@ -657,18 +664,21 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ #[generate_trait]␊ - #[external(v0)]␊ + #[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.pausable.assert_not_paused();␊ let caller = get_caller_address();␊ @@ -676,6 +686,7 @@ Generated by [AVA](https://avajs.dev). self.erc721._burn(token_id);␊ }␊ ␊ + #[external(v0)]␊ fn safe_mint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -689,6 +700,7 @@ Generated by [AVA](https://avajs.dev). self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ + #[external(v0)]␊ fn safeMint(␊ ref self: ContractState,␊ recipient: ContractAddress,␊ @@ -700,7 +712,7 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ ␊ - #[external(v0)]␊ + #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index 549562d88..35bd8992c 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 8e25e0de1..e5c538cf2 100644 --- a/packages/core-cairo/src/erc721.ts +++ b/packages/core-cairo/src/erc721.ts @@ -94,7 +94,7 @@ function addERC721ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { name: 'ERC721Impl', of: 'interface::IERC721', tags: [ - '#[external(v0)]' + 'abi(embed_v0)' ], } c.addFunction(ERC721Impl, functions.balance_of); @@ -110,7 +110,7 @@ function addERC721ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { name: 'ERC721CamelOnlyImpl', of: 'interface::IERC721CamelOnly', tags: [ - '#[external(v0)]' + 'abi(embed_v0)' ], } c.addFunction(ERC721CamelOnlyImpl, functions.balanceOf); diff --git a/packages/core-cairo/src/external-trait.ts b/packages/core-cairo/src/external-trait.ts index 4645d78ee..ed7e99e45 100644 --- a/packages/core-cairo/src/external-trait.ts +++ b/packages/core-cairo/src/external-trait.ts @@ -4,7 +4,8 @@ export const externalTrait: BaseImplementedTrait = { name: 'ExternalImpl', of: 'ExternalTrait', tags: [ - '#[generate_trait]', - '#[external(v0)]' + 'generate_trait', + 'abi(per_item)', ], + perItemTag: 'external(v0)', } diff --git a/packages/core-cairo/src/generate/erc20.ts b/packages/core-cairo/src/generate/erc20.ts index 5621199e7..e70c4d599 100644 --- a/packages/core-cairo/src/generate/erc20.ts +++ b/packages/core-cairo/src/generate/erc20.ts @@ -12,7 +12,6 @@ const blueprint = { burnable: booleans, pausable: booleans, mintable: booleans, - safeAllowance: booleans, premint: ['1'], access: accessOptions, upgradeable: upgradeableOptions, diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 37e370b78..386937d4a 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -132,7 +132,7 @@ function printImplementedTraits(contract: Contract) { const impls = []; for (const trait of contract.implementedTraits) { const implLines = []; - implLines.push(...trait.tags.map(t => `${t}`)); + implLines.push(...trait.tags.map(t => `#[${t}]`)); implLines.push(`impl ${trait.name} of ${trait.of} {`); const fns = trait.functions.map(fn => printFunction(fn)); implLines.push(spaceBetween(...fns)); @@ -159,7 +159,7 @@ function printFunction(fn: ContractFunction) { } } - return printFunction2(head, args, undefined, fn.returns, undefined, codeLines); + return printFunction2(head, args, fn.tag, fn.returns, undefined, codeLines); } function printConstructor(contract: Contract): Lines[] { diff --git a/packages/core-cairo/src/set-upgradeable.ts b/packages/core-cairo/src/set-upgradeable.ts index a77cd53f5..1cc89b187 100644 --- a/packages/core-cairo/src/set-upgradeable.ts +++ b/packages/core-cairo/src/set-upgradeable.ts @@ -24,7 +24,7 @@ export function setUpgradeable(c: ContractBuilder, upgradeable: Upgradeable, acc name: 'UpgradeableImpl', of: 'IUpgradeable', tags: [ - '#[external(v0)]' + 'abi(embed_v0)' ], }; c.addImplementedTrait(t); diff --git a/packages/core-cairo/src/utils/version.ts b/packages/core-cairo/src/utils/version.ts index d4e0b24bb..372aaa760 100644 --- a/packages/core-cairo/src/utils/version.ts +++ b/packages/core-cairo/src/utils/version.ts @@ -1,2 +1,2 @@ -export const contractsVersion = '0.8.0'; +export const contractsVersion = '0.9.0'; export const contractsVersionTag = `v${contractsVersion}`; diff --git a/packages/ui/public/cairo.html b/packages/ui/public/cairo.html index e45a5c280..f70741172 100644 --- a/packages/ui/public/cairo.html +++ b/packages/ui/public/cairo.html @@ -58,7 +58,7 @@ diff --git a/packages/ui/public/index.html b/packages/ui/public/index.html index 1e2d89b63..e33a0c43f 100644 --- a/packages/ui/public/index.html +++ b/packages/ui/public/index.html @@ -90,7 +90,7 @@ diff --git a/packages/ui/src/cairo/ERC20Controls.svelte b/packages/ui/src/cairo/ERC20Controls.svelte index a6e3e0eb2..15742d044 100644 --- a/packages/ui/src/cairo/ERC20Controls.svelte +++ b/packages/ui/src/cairo/ERC20Controls.svelte @@ -74,14 +74,6 @@ - -