From d33453be97c184d708ef6587ffda3c83459565cf Mon Sep 17 00:00:00 2001 From: Eric Lau Date: Tue, 12 Mar 2024 14:53:58 -0400 Subject: [PATCH] Use Contracts for Cairo v0.10.0 (#344) --- packages/core-cairo/CHANGELOG.md | 8 ++ packages/core-cairo/package.json | 2 +- packages/core-cairo/src/contract.test.ts.md | 16 +-- packages/core-cairo/src/contract.test.ts.snap | Bin 717 -> 718 bytes packages/core-cairo/src/custom.test.ts.md | 14 +-- packages/core-cairo/src/custom.test.ts.snap | Bin 1183 -> 1184 bytes packages/core-cairo/src/erc20.test.ts.md | 44 ++++----- packages/core-cairo/src/erc20.test.ts.snap | Bin 2270 -> 2269 bytes packages/core-cairo/src/erc20.ts | 4 +- packages/core-cairo/src/erc721.test.ts | 4 + packages/core-cairo/src/erc721.test.ts.md | 91 +++++++++++++----- packages/core-cairo/src/erc721.test.ts.snap | Bin 2070 -> 2145 bytes packages/core-cairo/src/erc721.ts | 16 +-- packages/core-cairo/src/generate/erc721.ts | 1 + packages/core-cairo/src/print.ts | 2 +- .../src/utils/convert-strings.test.ts | 32 +++--- .../core-cairo/src/utils/convert-strings.ts | 16 +-- packages/core-cairo/src/utils/version.ts | 4 +- packages/ui/src/cairo/ERC721Controls.svelte | 7 ++ 19 files changed, 159 insertions(+), 102 deletions(-) diff --git a/packages/core-cairo/CHANGELOG.md b/packages/core-cairo/CHANGELOG.md index 2f891031..d313b129 100644 --- a/packages/core-cairo/CHANGELOG.md +++ b/packages/core-cairo/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.10.0 (2024-03-12) + +- **Breaking changes**: + - Use OpenZeppelin Contracts for Cairo v0.10.0. ([#344](https://github.com/OpenZeppelin/contracts-wizard/pull/344)) + - ERC721: Remove token URI parameter from safe mint functions. + - ERC721: Add optional base URI parameter. If not set, this defaults to empty string. + - Use string literals for ByteArray initialization instead of short strings. + ## 0.9.2 (2024-02-26) - Remove code comment for Cairo lang version. ([#337](https://github.com/OpenZeppelin/contracts-wizard/pull/337)) diff --git a/packages/core-cairo/package.json b/packages/core-cairo/package.json index 315e5cf8..e1253a8a 100644 --- a/packages/core-cairo/package.json +++ b/packages/core-cairo/package.json @@ -1,6 +1,6 @@ { "name": "@openzeppelin/wizard-cairo", - "version": "0.9.2", + "version": "0.10.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.md b/packages/core-cairo/src/contract.test.ts.md index ec16ea3c..18eec541 100644 --- a/packages/core-cairo/src/contract.test.ts.md +++ b/packages/core-cairo/src/contract.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -44,7 +44,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -64,7 +64,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -89,7 +89,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -114,7 +114,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ @@ -142,7 +142,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.foo.initializer('param1');␊ + self.foo.initializer("param1");␊ }␊ }␊ ` @@ -152,7 +152,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod Foo {␊ diff --git a/packages/core-cairo/src/contract.test.ts.snap b/packages/core-cairo/src/contract.test.ts.snap index df21cd12805b48140aa379b01f8c227f7c59c3bc..4631a7480dd5bef52ac67ef59e7fcf919a0f7f25 100644 GIT binary patch literal 718 zcmV;<0x|tTRzV?As>qf00000000B+Rn2bGKoCxf5W+WZoM1^Wj+CS+M+dm{M~YMgQhF#tIF+TElD6d_KCH{e=sya6x58}J~kz3bq0tO61eEs8Jp&VI8q^L;bxi^z{za4J50 z21#TLEMQb}97yD2K>|Sp#i^JwDc)a%A(r^)>y5^(M)ovsHtuYEX>4tw(evG-?g0sa z3g`|)pprxcxQCt&4;{6?!;%zB;>Uo_h@7HlDbSaYrVtaVHg!OOBF51UCY+&H{oZ!J z*LR%FV<9m=r64`8$ZYH+EJXW^p|=iFPljO}pTIa@3dv_G{gJjA%)(hXro!`k%M$Zs z)JnUk=m861rQ#ROyH?4!o7bdd11%M(;Sntt?Q)2afH?A&d5t8N&^G7f0ayb2Ga5+3 zsM{W_P};qmQf(EGkbuREt{MJwhFdnnk%4M@eNa`_HSRl$*7TaudIA)<;%TCeB64i3 z*e7lZd_p87ZEYk;8l$~)37p~>v1s{ym^qeM-aH1gm*hWt!;% zs_H%bwR)8qS-p7IYF-sJk*y}7L=qg6H^5PfIZkS{+xTv2_if{!Yc~^+m+W~e$kg-H zP8N_+mB&D978L6TZjM1^Oa~e5J(U6LAebv-4%y4T+5@MgFeE;Nlch+x!U{Re-jA(g z^F%WHBkQVsVvbvSQZ0P#3FXcDV}7S`4Q}QeXr;#(^D1GDd&h43oR^~8L*Qf%?k;C( z#$Tb4W=w;C&JvUxtURI^%b(E;ma8e`#!3Qzh$TM!dZlr#kv+|;jT@~mjjb&-dbV@e-6sK1 z0o`E;RFa4Q_t2B!fur`fS(0K&{20(HBB$tS3iJh}Da3@TO&w66h;g)y31{eKzxSZm zcbttQAu&IpAU&^0Z0sZ~M0<>(w+>QIhG85Z!#H0G$!9A2k+vDk!dW<`z|&jH3iDjl zO1r4w0SjTJ;OEVoR>jwwm!o0>E!C&t5iQs3a)^+CIP#WhjU<-PHs|C4SOR-98c4#Z z+a9bi+C869Z55D^fW?fi3I1b(@7e@M2CCWhK^0low(l%f+2vyO7$|T>(?lIbD&@hTItdg-pkydYvCTTDWUBseB-fTI+1oYY9y`ff@0t@W>^n+eD(_B<71>UnA> zi^r%+W1uAqiuD~g$DlH%gN*c^N`Q3`%#|^R>}Fr>fm0F~5+B0JQlng8g&bz@N7k`< zBANZ6bx%Gv$1Odn*1h(G@@D-pztgt{H}eg&(qfExm9WOWV|RVdOVR8ha54vXhqE-} zuh2*{ra?ew3Cayt9#M?t&*%lq)f94LC4s;3XHwfeRdKJ>>F#FU>i0Hl{#3W^`A~(@ z5UVQ{Yt;d2xvv-N5&9oSXyN<-e6@sy8VvvdBsp3C diff --git a/packages/core-cairo/src/custom.test.ts.md b/packages/core-cairo/src/custom.test.ts.md index f124755d..68b1a8e6 100644 --- a/packages/core-cairo/src/custom.test.ts.md +++ b/packages/core-cairo/src/custom.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -24,7 +24,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -90,7 +90,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -148,7 +148,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -163,7 +163,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -204,7 +204,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ @@ -256,7 +256,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyContract {␊ diff --git a/packages/core-cairo/src/custom.test.ts.snap b/packages/core-cairo/src/custom.test.ts.snap index 99e95ea1507041a3b0364c2d8b1ec144bfb7624f..48e84d6aad0f676cb98b035224a2506f063fff4b 100644 GIT binary patch delta 1179 zcmV;M1Z4Z437`poK~_N^Q*L2!b7*gLAa*kf0{~EqWe8a4bafZrWr`<7ZMLTv$g4}X z?8kzO<2RTY{k9*A2mk;800003?ODxk+%^z)V>Cwh)?1G(f&gn^v)LYUk=q8w+Cdkv z>mYW3G=VE{rIDAgL0(}sVCohbIv?s+j0z3CwNQKm7&M{t-8xnQZhx1V3rHW!_Xj>b1haLTbv zsfO^6wZ|63!P=rgOgW%fI)1GkI}QggWkj4iP65Ypp6dTpN->q0ZnR9so(G&ePJBx9 znS1#^4HKs+7AbA|K9jRII+=}EO!=`Z%P?_JEr}k|%j18bBGn#(6M1K9ysd`o8_gc8 z$r%ncfYP5fE!^q$z+=*dXbir4GFZ=>ghWYLMjxrcFZIl)6;&2L7X{cCSir9vGo0&G zwC^g0vgDudd59wj_h@)ND}-fOi`7sLDu7WOwwJ}UXiVO!fbFiH=B3`|-r?FV9c$BW zSv2)2H%WgJ9POw#ho54{G{CUDToj3Cjd`dCJ}`0u-7OX;J!5C(?V1|_O(T?Duy6$- z7Sk-OZPN%TyVGlRVD6J9EXMQ_iKM8!@G;9B1r!V0^Fo=(5y*?uvn$<^vbKL}wTF?%_@8MgQc?n++AFi)i|V7KA$4GPI+w$M-(Rp*prh-M(9Re4&@U5hWX?R zM7w_poguTva+XqSO!6CHr4+&%B;~S%}sR+#kSh$ZNR=}$!*&yW=Cs% zHR-C-W=41=TDe_22nwgJr^wBnNOqIA3!=LQJu@0rN}A5Z4tSZso#qseGC_$$|P$eJ{oK~xs%GpK*h z_N#d9Dgnz0SB$EPq2pM^%e!U=@PZ83G_V>1=5;{R@)tSWibb>!@R@vTx$ t_VYedFOO-K$27}hn&mOg!awIPk7*N@$28VAUW;-}^B+X_cTV#m002KDK3)I- delta 1178 zcmV;L1ZDf637-jnK~_N^Q*L2!b7*gLAa*kf0|4F-a|Ok95wtS-fyKnGb8HAE%6iUMn3v-Ty2%54B+?VtL!&O2U4JjaWuk&GxYQJ@ay4rulMCo zLSlYSL3&`s4s2@BETRXGp+(nIQ_O&P~$aGDQ=7rw+ocjU_>t2|!HwePjH3o`4|ZL|%DbiN^DuoBwo1jH*O;Iws>F03ke&UD9Ia zQSnd9#94}EO1ojm)$E;KZWEMKzUZqeOg+>{Vt~x*c&L9&b%5YP-I*Eh>*3~3yT^KR zmO}%e@@Gs-ccwe=g!CbqKgc3<`Ox^(R=Ti+YREeB{x~M$+${nd{t9O4(3fw0W5_`AozqZfo6pa&^bHutx@^v&UqrHO4CpxtX7v72EMqxI7QZWn zJZk6R&t>AZ9Oy5JZ z+t7bmDr>D~rL@+R|3|zZp1xWot7&3e{U4&rT8+})R1Z*V>y6$8>_b-EuAO3cw2@bv zu4-*&h1Z%@*mZ-TaOnq{-2ACxH+8!tx;v0Ft5KDrnM~Y(H|g7DLGdUT6c(e9{HN2+SO=(~M*TMVG`jX(i-&f$3<~4sZUIukq4n298LQqkGtWkmb0nze||G7g1 zpDyn+en|wyUjxhYcJtw=7|wliC)!M;5JTo2`PFr(+-ai)dCrM!IHMgzZK2+Q`CNa$ zn$~U;u$pkosJa*?j#Ip%Yvz!u3)!XCuB`8aVBH?>Oyw4@0Qp90ROtT5y150qVa<5~ zsM^1Q=S~?vga~J`^l_LddYQ}o&XPI&U+&TlQ(rwZQ|W8^?>EV+mPb=YUVl}7qf~JH sq7T%o6Pnct&FX|^bwac3Px-48n$;2sjq`2SvYgQT2fk$$3G5*N0ALAD&Hw-a diff --git a/packages/core-cairo/src/erc20.test.ts.md b/packages/core-cairo/src/erc20.test.ts.md index 497095ce..bee9f2b3 100644 --- a/packages/core-cairo/src/erc20.test.ts.md +++ b/packages/core-cairo/src/erc20.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -41,7 +41,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ }␊ }␊ ` @@ -51,7 +51,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -84,7 +84,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ }␊ ␊ #[generate_trait]␊ @@ -104,7 +104,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -154,7 +154,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -237,7 +237,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ ␊ @@ -299,7 +299,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, default_admin: ContractAddress, pauser: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.accesscontrol.initializer();␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ @@ -385,7 +385,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -436,7 +436,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -526,7 +526,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -559,7 +559,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, recipient: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ ␊ self.erc20._mint(recipient, 1000000000000000000000);␊ }␊ @@ -571,7 +571,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -603,7 +603,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ }␊ }␊ ` @@ -613,7 +613,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -657,7 +657,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -678,7 +678,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ ␊ @@ -734,7 +734,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, default_admin: ContractAddress, minter: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.accesscontrol.initializer();␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ @@ -758,7 +758,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -818,7 +818,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, recipient: ContractAddress, owner: ContractAddress) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.ownable.initializer(owner);␊ ␊ self.erc20._mint(recipient, 2000000000000000000000);␊ @@ -925,7 +925,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ @@ -1006,7 +1006,7 @@ Generated by [AVA](https://avajs.dev). minter: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ - self.erc20.initializer('MyToken', 'MTK');␊ + self.erc20.initializer("MyToken", "MTK");␊ self.accesscontrol.initializer();␊ ␊ self.erc20._mint(recipient, 2000000000000000000000);␊ diff --git a/packages/core-cairo/src/erc20.test.ts.snap b/packages/core-cairo/src/erc20.test.ts.snap index aebafc4882b886e0bda76535323c2dd139e81282..63b18875abb5dde69f8c5a94021702e1682d6baa 100644 GIT binary patch literal 2269 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 literal 2270 zcmV<42qE`DRzVVSQNeU^QLeUFh6rH~RO%Z}|xHhoDXk?$WL zAD@1F)CaR|yT-Bq+g}J<*ha@~=vxLrp0ToQ`3~&+T^IYmeCTu_hOe*xcm3L}YxMWg z&1-i){`dNmCt!bfI%tsR>u#?PvDLN_IJIyW?DUcI zBkK2&Z8_wjgFR?qADFHO)}iIO;OFI~FPD}ZjYmKE7<$JJ!kT8Vc5fOzw*$7%4%}np zfcFhReu0mGONhQ>L^Tc5rnqDt3fCdRJ#B=YjQILNlStRqfY_=9eC&Gg z2x*ZiS^%Ap+pO6p{eO{Bdh`=)TTRq!qmF*Ey!a-(Y4!Sc)OH(TNNu-8?|hwN!-V78 zd=;ByA480uJuSndi1w&7*I^IYJC1!;L|kZ;;gXip!N_x-RRv&wT zfx&)sk2wQt7qnT^W}+JXMIMo1%}BJucIPp(aKzuRiw^Rv6V%-B+&=Y<*e@ebh#Da$ z=z;KtAd6{3d?CSw|767oZ>NMHjvwjidJz%R0o=W&hfLrj+th$yvPDh=`gkeSe93Yw zY(d+4hrH$jn?(yPu&{mb-NNEi#`(O#Vu2HO0_}hd3z@#zaB%Z8Asl>ivyR~)?sGx? z2w~lTwv9X;b~+yNeHAoR&`?36C}=RwM>J>qPI>yYzzMViG8==H)h~GE=+8zNM3bDjRd&WVnPw7u=poOjIb*>! zKF^7weHi%iD0;gqMA6r`>l{Uk`dDSI%_jX%yy31zh5XvI1wk}(PmWgq##+7drI5p2q7P1GC#;#-;s{~K;bS}hQt$Ec_I?>j&Gs@NA!?k z^(`c^6|rJ3GGdf-65-meYs-X-gU}N6edJ-?aj{PCp-w^W$;rk6cBDO*f61MXRMK{e9Vfy>G@pDpb_Sd;B!-l076~LU>b>v@p{h;;t~(n z!?i(bki>qG)tbV~ei;D+XL=&WyowNsx1WlTL7K3_Y0d7!UtY;U~^hoKa>k~9fODA2U`+%TTk5PFdh z0!LP`T0&dsR>(jYB91N{z=RxaG%t{jU^>P@J_@NRa#>zsCNvDgq{EP0>1Z-O!stiy zwYKK;>p3pO1QF5Bojp}W;246O2u4xQe0LLtF3T2g~KTvu1+X| z!r_3z;S>&c2~V2?98Syuc&IC#2vi1_8<)ssaJo~m{<5Hi=nfV@I&?>s5M5mfQMSos z3reMgRH2b7G^!&|qza8xp^=P$Dl}36hXObhz)_jkGX-z}1#l>U;}V`W2LQ*s6&jTh za^w?RL;Bd%4tTk&n#w~x8rV8nc;-f1fM@n^)ES zPD2Twdw;$x`(@AUdqOax3!VCmhYB_-*wi!FjPo-dG#61s{ zuEt!PJmS{TSnXL(T?f=MbJiGZDti)TvSwi0Am|hGcaR*Hy7!Ne#{PY8c5tbRRyB(q z+2D|_hZn;%L@&O~gQGCUB5DaCoA~j!(C^Mwg|(ENY|uE8+|*0Ra$PEvT&v>kc`Dvc zsBzAiqA2t1x+KffE(tHD!UX|&z^F^wJ_lE*RnH3qYBuZG0enIs~^!h(eda+tTUaN+*<0^<)a`Kh#opRRaYvzz`n>HV%Q8koxJM}Fs3=69Jj{NOw*`dVFu^I+$9l(6 zwj!mXKzmiRQlX-i%6|t~nrErqf-02g6!%v<5ApT1D~4npC%Ju*Fc}EpltE?&R4WNH zrw|ItDQjw_Jv6V$bnBl+*-OdcGxg6lm*|{dc~zpbkejxWaZ@`=YDY=!DAfrMS362T s?I@`orAv6)9PB8mk4CE}oW0MSZRBLDyZ diff --git a/packages/core-cairo/src/erc20.ts b/packages/core-cairo/src/erc20.ts index a1665d91..b538f1df 100644 --- a/packages/core-cairo/src/erc20.ts +++ b/packages/core-cairo/src/erc20.ts @@ -10,7 +10,7 @@ import { defineComponents } from './utils/define-components'; import { defaults as commonDefaults } from './common-options'; import { printContract } from './print'; import { externalTrait } from './external-trait'; -import { toShortString } from './utils/convert-strings'; +import { toStringLiteral } from './utils/convert-strings'; export const defaults: Required = { name: 'MyToken', @@ -57,7 +57,7 @@ export function buildERC20(opts: ERC20Options): Contract { const allOpts = withDefaults(opts); - addBase(c, toShortString(allOpts.name, 'name'), toShortString(allOpts.symbol, 'symbol')); + addBase(c, toStringLiteral(allOpts.name), toStringLiteral(allOpts.symbol)); addERC20ImplAndCamelOnlyImpl(c, allOpts.pausable); if (allOpts.premint) { diff --git a/packages/core-cairo/src/erc721.test.ts b/packages/core-cairo/src/erc721.test.ts index 248d5bf0..b9cf264b 100644 --- a/packages/core-cairo/src/erc721.test.ts +++ b/packages/core-cairo/src/erc721.test.ts @@ -31,6 +31,10 @@ function testERC721(title: string, opts: Partial) { testERC721('basic', {}); +testERC721('base uri', { + baseUri: 'https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/', +}); + testERC721('burnable', { burnable: true, }); diff --git a/packages/core-cairo/src/erc721.test.ts.md b/packages/core-cairo/src/erc721.test.ts.md index 7c1f4e35..89a738d9 100644 --- a/packages/core-cairo/src/erc721.test.ts.md +++ b/packages/core-cairo/src/erc721.test.ts.md @@ -9,7 +9,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -51,7 +51,59 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ + }␊ + }␊ + ` + +## base uri + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ + ␊ + #[starknet::contract]␊ + mod MyToken {␊ + use openzeppelin::token::erc721::ERC721Component;␊ + use openzeppelin::introspection::src5::SRC5Component;␊ + ␊ + component!(path: ERC721Component, storage: erc721, event: ERC721Event);␊ + 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 ERC721InternalImpl = ERC721Component::InternalImpl;␊ + ␊ + #[storage]␊ + struct Storage {␊ + #[substorage(v0)]␊ + erc721: ERC721Component::Storage,␊ + #[substorage(v0)]␊ + src5: SRC5Component::Storage,␊ + }␊ + ␊ + #[event]␊ + #[derive(Drop, starknet::Event)]␊ + enum Event {␊ + #[flat]␊ + ERC721Event: ERC721Component::Event,␊ + #[flat]␊ + SRC5Event: SRC5Component::Event,␊ + }␊ + ␊ + #[constructor]␊ + fn constructor(ref self: ContractState) {␊ + self.erc721.initializer("MyToken", "MTK", "https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ }␊ }␊ ` @@ -61,7 +113,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -104,7 +156,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ }␊ ␊ #[generate_trait]␊ @@ -125,7 +177,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -185,7 +237,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -307,7 +359,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -361,7 +413,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -374,11 +426,9 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ token_id: u256,␊ data: Span,␊ - token_uri: felt252,␊ ) {␊ self.ownable.assert_only_owner();␊ self.erc721._safe_mint(recipient, token_id, data);␊ - self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ #[external(v0)]␊ @@ -387,9 +437,8 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ tokenId: u256,␊ data: Span,␊ - tokenURI: felt252,␊ ) {␊ - self.safe_mint(recipient, tokenId, data, tokenURI);␊ + self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ }␊ @@ -400,7 +449,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ ␊ @@ -458,7 +507,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, default_admin: ContractAddress, minter: ContractAddress) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ self.accesscontrol.initializer();␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ @@ -474,11 +523,9 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ token_id: u256,␊ data: Span,␊ - token_uri: felt252,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc721._safe_mint(recipient, token_id, data);␊ - self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ #[external(v0)]␊ @@ -487,9 +534,8 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ tokenId: u256,␊ data: Span,␊ - tokenURI: felt252,␊ ) {␊ - self.safe_mint(recipient, tokenId, data, tokenURI);␊ + self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ }␊ @@ -500,7 +546,7 @@ Generated by [AVA](https://avajs.dev). > Snapshot 1 `// SPDX-License-Identifier: MIT␊ - // Compatible with OpenZeppelin Contracts for Cairo ^0.9.0␊ + // Compatible with OpenZeppelin Contracts for Cairo ^0.10.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ @@ -570,7 +616,7 @@ Generated by [AVA](https://avajs.dev). ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ - self.erc721.initializer('MyToken', 'MTK');␊ + self.erc721.initializer("MyToken", "MTK", "");␊ self.ownable.initializer(owner);␊ }␊ ␊ @@ -698,12 +744,10 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ token_id: u256,␊ data: Span,␊ - token_uri: felt252,␊ ) {␊ self.ownable.assert_only_owner();␊ self.pausable.assert_not_paused();␊ self.erc721._safe_mint(recipient, token_id, data);␊ - self.erc721._set_token_uri(token_id, token_uri);␊ }␊ ␊ #[external(v0)]␊ @@ -712,9 +756,8 @@ Generated by [AVA](https://avajs.dev). recipient: ContractAddress,␊ tokenId: u256,␊ data: Span,␊ - tokenURI: felt252,␊ ) {␊ - self.safe_mint(recipient, tokenId, data, tokenURI);␊ + self.safe_mint(recipient, tokenId, data);␊ }␊ }␊ ␊ diff --git a/packages/core-cairo/src/erc721.test.ts.snap b/packages/core-cairo/src/erc721.test.ts.snap index d25dbde5af17b09a159ba66b271a9f1d71e794d7..dd8e7136a16645a2bd7588a3951126673246bb38 100644 GIT binary patch literal 2145 zcmV-n2%h&rRzVU(Cqca>O`5ns z*P_#CnToZ_q9)Qw(;|nRHtY>{?5=x*y}{mK53|EaiIPc)lK;eU6Nf$|kwpIZeLwR1 zN11u=v^`|M#=rgviAy{P+W@<^i+vE_E+Y7s_ni(P;QOn8e{$v8754e)>Xpww{_E=U zva!Fr{`}6CYeOHyJIxOCiR-v9G>z?Mt3sbQP%i+)ZF|r-a!J?N384Q11_AV3pFZ?S z2yB842ZcrhxFIrrSXsKevb0jE+0@Xh ziu#tLnkHdSO%sOpSF3kTb7QYTe=|XlPvyH`(95MmARIuOxQJfj&|Wjm{k_JT&@<|4 zC)c;CRJE>YWCo}in4l0GK+}jts2T8(-cK5Cu#3g}YAk6$0f~u|;;=>uN(6KJC1|@< z*lWX%b-1$lD!S?R0*?>54GCaV*krf9&I+7RB({2x%*{Rl1U|e!)-VmwgWits9Snj!vldx|SV?Vyf z&5O6|w|UcQst5aU8_N&QL24slM3$CgLF|8$h#Rf{SNx&_L-!C?*FzLALrHu^Y#4DP z==Xa@bVJg{@c;MwW2A&5)3v@am#8?Lv9aMBs(Lv>+1eHMy;KLt4ABGgqqR?*2BU_>Y z^>QwOJ;@H<22-^BmiUDHi9D}VHx_Y*r#*+q$^h^N<4Nr10H~@XDj=?wnkYe!fH|8n^XL`BJH#xwD(}>w}PYi8Z5|d-o zOt?19UH;e5&cL?m+A>YLRN|gH@gJp`LPB)?9H$9NlpHMrQbJyemNYI!%+e(Qa!OM? z-c;u?ljH*BfXP&G(A+c+3}OOsK5ra5JK?FtOpYv3SvEvD=Tl9W^3=*`3W`U=OW2a( z@+!|yGFRR|_1P*)$G}M(xPr>LN-b3#B~Ps+atMIvnpF%=F}1B3QC2p%%Y*1CQ{J>2 zUk6gZXvA!8JVKF4bKo>@p%xiG$rz&`Hp_p32Yee^$f?G4;%g&v7GBgu|wy&HD`o<++y zix#aVE;L|eJ<5C0T0#O1~d=PUOJVER9<& z?t?Zzu%~T)n4mR0S~W)vR_BkwX%IAon=&_F=RR~3h4pjem&H~aZNVw(~Hg4 z#fb!**;)AW(>U^(Z_Y>aKguhIRK28_;)@8;pusoQRf{NHbMZ>6s#i;ifPH^$mu)+qu8oo9lWrTyJ70*Oze*dgdu$ zRM@esW`dF|gti;FP*L-r<#y|M`Can;jDeo1)T3>)4&iQl2GmWf<}cm za$n;MBSap=`5gHAZ&D6?eEm#w;K;5i%#+r}p0&5LwP6~Z2pTe|!jM_~Eoz^G7R)d& zVD23Mj$}oiY1X65MtnIb$oj@+{n=K_s;^UiB63Db#M35y>X1zHoj~r%#YxlE3<_`( zSt+j6O(*U;aTful#lex)>nvlzryVO|VVnWe4l_#XWo>21B7rYUf-igJLOSL?+0VPy zVlt+h_;;WK`W~@BhvqkmZQx$?zU<5@18M%H-brXFXlfmVz$X^V#H#sNp3$p(R1r#u z=ZWsRMj1QPmiZMcl`P4+W;xTE#p!#V(GTbX??Cmw{mr&iv+UoTt9|?V`_jGKkxwl< zs4JT0S+`TyU(s?>2poCM+z5pqBfD~5fqDwh_0^tI^ zBsrHS5K=V3t}=)!BfUJ8-mK3xl%oh9QSCi1LCrbKQxdA~*$7lL5%c(>OCPq-hb{DB z3w_u^AGXkkE%adveb{1Piu$mHK5U^6Tj;|U`mn`iJ8UtEkf-^7Qe&FteEj>VQAoXb zFIXpBcVng8`u*#q?_Y=H%Hj?&_ow2^x6;Iz?^_nT03RM%HhaTnbph_u$I08aDXb%5 X)0Da}E{Qy#@@@40p&DH0l3@S<2-G9u literal 2070 zcmV+x2|%R@y+C)dH`tr(4fYnh8Yz)9DN*uITsN`hi#C>czH`n; z^6(ro%sa0aAopeb`=5~bB!I97V&C=S5Jd4YBJr>9`h7sa)60K++pD*1?mlpKkB?E(~LMyVHju@jV}6+uH4P8}$7q8bpBjy#QLTd~$5hp@E?e2lE0@2-8jcDK>E^*km3zYHO- ziJ^rk=o=1d+l0NfZHV1(*1xjt?fp&qKeGdc)VzBoQa)9I;t0CLNAzoq-3{A5*x%ex zBvVmWe8178o*mm(PC?6x3BuqA+E!*l%YrBLxoEh}zO3FeV`&N%Bxa7pVT}Yz3Uli@ z==n`J=)t~oa(DGb`p_Rl0av*T31B_gVUNDc8!RYNTiq93b3g!r5AIE*W)loxuonie zN9&SJr&e0+)6}qI_;426Sr>B4wJy(woDs0#ct{`)K~P43`rZu2rdT?@GQ(nm6PH*A z*)u-9c)O&>n>M8%?8E0+Q8@=`je(KQv;qsN{HZWE9se)*mp;V)32bg*6tRgSVnsGF zvPLjW23Gn&^TrDR8R}PNrNNQ(d8<@dPQ`);ilDTg#<7fKgfj>)w3KH}3_UA`foEG< zf2}Ikv)5}G?Q4GM6CVWr8;F}LJSwiVtd-sFk1IUDoHkAyJgOh}5;`1cAT9>>E6=sS zzH?>S0=tkLT6P49m#9lvi|$@<3Es)OtkKw@RFmk#V= zAZ~K!#0SJN#H6WG=@>y8&fD31_T^ZG}k~0Be>xD?FVT>oXdw* z8WeC2v#R8rsu`)n+QbQW`|CTFYt=Cq%?y&tN}aoT#iB$YB4l zz8LmLD>X-}BveArGnX@@Y7|SQ{P3!;s`M;+H=-UrgCD}2v22fNshbIaz@e3!L+jOw z@ENg+9u*^KOOQa_=^+%%as-~5(HE{x<+|17G3en3 zjqQUpmO@l~|xoo60&7-Blz$BcXi9%Q9zWso% zp5}e~t53Ck`yZ|@(!Txl`|!)Pm0oXr*Jt-<+q7Tqef4@DyxzYS-h2kBMC4s21JmL$^B=1@*Pn>g!b z2JOzFU#8egkg|vSopF1moL{kL(2|%{$#*1@Z|h47qX5RmB>eMFwIuw%&)#Peo(2|* z^0>Rb@9gjGY)eAunngW_Eacp1-c(xLWSQQ@OWw2pQ(IAB+wJu0X7+Vjkge^9?Zcg} z)83-|q~wfM3CJc1jf%GYRw4KF;?xOd1{FAsEQza$)s;hCIjDfz;NZySah99GXVsOm zFo{AbFsG_Q_g052Gk94l3_U8B(y{Q>MlrOOlQGlEqYpih1jGS-n%)?;p$F-C-Fqob zw7%CQ#j;Y;)H%W+Bo0f$n#FZI=To&-6-rslh2M3NH1i@!=U*+A@|{o@O$$&oc}Wmh zNkpevADT}tuK%kQP5)e9q?3!qyK$fk@}6avREB*#ft32&APT}{wOHjvNdr(oqs}7` zA77k;?L6I)Fv6L7Ux8EtfP_^<>RPhCesO`0iO%Kq3yG%8s~nYFC@O_TbjNqy6#zG+h5G^uZz)Hh9rQ?b5jQr|SG zZ<^FMP3oH_%XZUb93#*2ceEy)nv3ygx5goL@lJTB9G4TN = { name: 'MyToken', symbol: 'MTK', + baseUri: '', burnable: false, pausable: false, mintable: false, @@ -30,6 +31,7 @@ export function printERC721(opts: ERC721Options = defaults): string { export interface ERC721Options extends CommonOptions { name: string; symbol: string; + baseUri?: string; burnable?: boolean; pausable?: boolean; mintable?: boolean; @@ -39,6 +41,7 @@ function withDefaults(opts: ERC721Options): Required { return { ...opts, ...withCommonDefaults(opts), + baseUri: opts.baseUri ?? defaults.baseUri, burnable: opts.burnable ?? defaults.burnable, pausable: opts.pausable ?? defaults.pausable, mintable: opts.mintable ?? defaults.mintable, @@ -54,7 +57,7 @@ export function buildERC721(opts: ERC721Options): Contract { const allOpts = withDefaults(opts); - addBase(c, toShortString(allOpts.name, 'name'), toShortString(allOpts.symbol, 'symbol')); + addBase(c, toStringLiteral(allOpts.name), toStringLiteral(allOpts.symbol), toStringLiteral(allOpts.baseUri)); addERC721ImplAndCamelOnlyImpl(c, allOpts.pausable); if (allOpts.pausable) { @@ -132,11 +135,11 @@ function addERC721ImplAndCamelOnlyImpl(c: ContractBuilder, pausable: boolean) { } } -function addBase(c: ContractBuilder, name: string, symbol: string) { +function addBase(c: ContractBuilder, name: string, symbol: string, baseUri: string) { c.addComponent( components.ERC721Component, [ - name, symbol + name, symbol, baseUri, ], true, ); @@ -202,11 +205,9 @@ const functions = defineFunctions({ { name: 'recipient', type: 'ContractAddress' }, { name: 'token_id', type: 'u256' }, { name: 'data', type: 'Span' }, - { name: 'token_uri', type: 'felt252' }, ], code: [ 'self.erc721._safe_mint(recipient, token_id, data);', - 'self.erc721._set_token_uri(token_id, token_uri);', ] }, safeMint: { @@ -215,10 +216,9 @@ const functions = defineFunctions({ { name: 'recipient', type: 'ContractAddress' }, { name: 'tokenId', type: 'u256' }, { name: 'data', type: 'Span' }, - { name: 'tokenURI', type: 'felt252' }, ], code: [ - 'self.safe_mint(recipient, tokenId, data, tokenURI);', + 'self.safe_mint(recipient, tokenId, data);', ] }, diff --git a/packages/core-cairo/src/generate/erc721.ts b/packages/core-cairo/src/generate/erc721.ts index c420495f..448adcf7 100644 --- a/packages/core-cairo/src/generate/erc721.ts +++ b/packages/core-cairo/src/generate/erc721.ts @@ -9,6 +9,7 @@ const booleans = [true, false]; const blueprint = { name: ['MyToken'], symbol: ['MTK'], + baseUri: ['https://example.com/'], burnable: booleans, pausable: booleans, mintable: booleans, diff --git a/packages/core-cairo/src/print.ts b/packages/core-cairo/src/print.ts index 360c4a1a..e7dc9457 100644 --- a/packages/core-cairo/src/print.ts +++ b/packages/core-cairo/src/print.ts @@ -224,7 +224,7 @@ export function printValue(value: Value): string { throw new Error(`Number not representable (${value})`); } } else { - return `'${value}'`; + return `"${value}"`; } } diff --git a/packages/core-cairo/src/utils/convert-strings.test.ts b/packages/core-cairo/src/utils/convert-strings.test.ts index 1d5b94d0..f0acda8d 100644 --- a/packages/core-cairo/src/utils/convert-strings.test.ts +++ b/packages/core-cairo/src/utils/convert-strings.test.ts @@ -1,6 +1,6 @@ import test from 'ava'; -import { toIdentifier, toShortString } from './convert-strings'; +import { toIdentifier, toStringLiteral } from './convert-strings'; import { OptionsError } from '../error'; test('identifier - unmodified', t => { @@ -42,29 +42,31 @@ test('identifier - no valid chars', t => { t.is(error.messages.name, 'Identifier is empty or does not have valid characters'); }); -test('short string - unmodified', t => { - t.is(toShortString('abc', 'foo'), 'abc'); +test('toStringLiteral - unmodified', t => { + t.is(toStringLiteral('abc'), 'abc'); }); -test('short string - remove accents', t => { - t.is(toShortString('ábc', 'foo'), 'abc'); +test('toStringLiteral - remove accents', t => { + t.is(toStringLiteral('ábc'), 'abc'); }); -test('short string - remove non-ascii-printable characters', t => { - t.is(toShortString('abc😀', 'foo'), 'abc'); +test('toStringLiteral - remove non-ascii-printable characters', t => { + t.is(toStringLiteral('abc😀'), 'abc'); }); -test('short string - escape single quote', t => { - t.is(toShortString("abc'def", 'foo'), "abc\\'def"); +test('toStringLiteral - escape double quote', t => { + t.is(toStringLiteral("abc\"def"), "abc\\\"def"); }); -test('short string - escape backslash', t => { - t.is(toShortString('abc\\def', 'foo'), 'abc\\\\def'); +test('toStringLiteral - does not escape single quote', t => { + t.is(toStringLiteral("abc'def"), "abc'def"); }); -test('short string - max 31 characters', t => { - t.is(toShortString('A234567890123456789012345678901', 'foo'), 'A234567890123456789012345678901'); +test('toStringLiteral - escape backslash', t => { + t.is(toStringLiteral('abc\\def'), 'abc\\\\def'); +}); - let error = t.throws(() => toShortString('A2345678901234567890123456789012', 'foo'), { instanceOf: OptionsError }); - t.is(error.messages.foo, 'String is longer than 31 characters'); +test('more than 31 characters', t => { + t.is(toStringLiteral('A234567890123456789012345678901'), 'A234567890123456789012345678901'); + t.is(toStringLiteral('A2345678901234567890123456789012'), 'A2345678901234567890123456789012'); }); \ No newline at end of file diff --git a/packages/core-cairo/src/utils/convert-strings.ts b/packages/core-cairo/src/utils/convert-strings.ts index e0966e9e..6a5e02e8 100644 --- a/packages/core-cairo/src/utils/convert-strings.ts +++ b/packages/core-cairo/src/utils/convert-strings.ts @@ -20,19 +20,11 @@ export function toIdentifier(str: string, capitalize = false): string { } /** - * Converts to a felt252-compatible short string according to the rules in https://docs.cairo-lang.org/language_constructs/literal-expressions.html#short_string_literals + * Converts to a ByteArray compatible string literal */ -export function toShortString(str: string, field: string): string { - const result = str +export function toStringLiteral(str: string): string { + return str .normalize('NFD').replace(/[\u0300-\u036f]/g, '') // remove accents .replace(/[^\x20-\x7E]+/g, '') // remove non-ascii-printable characters - .replace(/(\\|')/g, (_, c) => '\\' + c); // escape backslash or single quote - - if (result.length > 31) { - throw new OptionsError({ - [field]: 'String is longer than 31 characters', - }); - } else { - return result; - } + .replace(/(\\|")/g, (_, c) => '\\' + c); // escape backslash or double quotes } \ No newline at end of file diff --git a/packages/core-cairo/src/utils/version.ts b/packages/core-cairo/src/utils/version.ts index 6ec406d8..1081f30f 100644 --- a/packages/core-cairo/src/utils/version.ts +++ b/packages/core-cairo/src/utils/version.ts @@ -1,10 +1,10 @@ /** * The actual latest version to use in links. */ -export const contractsVersion = '0.9.0'; +export const contractsVersion = '0.10.0'; export const contractsVersionTag = `v${contractsVersion}`; /** * Semantic version string representing of the minimum compatible version of Contracts to display in output. */ -export const compatibleContractsSemver = '^0.9.0'; +export const compatibleContractsSemver = '^0.10.0'; diff --git a/packages/ui/src/cairo/ERC721Controls.svelte b/packages/ui/src/cairo/ERC721Controls.svelte index f66fa34e..edd04aa6 100644 --- a/packages/ui/src/cairo/ERC721Controls.svelte +++ b/packages/ui/src/cairo/ERC721Controls.svelte @@ -33,6 +33,13 @@ +