From 1345f3ba375ca1d03924090ca312dd8b55a9c559 Mon Sep 17 00:00:00 2001 From: immrsd Date: Tue, 2 Sep 2025 14:06:07 +0300 Subject: [PATCH 01/22] Support customizing decimals for cairo-alpha --- packages/core/cairo_alpha/src/erc20.ts | 24 +++++++++++++++---- .../core/cairo_alpha/src/generate/erc20.ts | 1 + .../ui/src/cairo_alpha/ERC20Controls.svelte | 8 +++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/packages/core/cairo_alpha/src/erc20.ts b/packages/core/cairo_alpha/src/erc20.ts index 667fe11ba..431d2a347 100644 --- a/packages/core/cairo_alpha/src/erc20.ts +++ b/packages/core/cairo_alpha/src/erc20.ts @@ -1,4 +1,4 @@ -import type { Contract } from './contract'; +import type { BaseImplementedTrait, Contract } from './contract'; import { ContractBuilder } from './contract'; import type { Access } from './set-access-control'; import { requireAccessControl, setAccessControl } from './set-access-control'; @@ -19,6 +19,7 @@ import { addVotesComponent } from './common-components'; export const defaults: Required = { name: 'MyToken', symbol: 'MTK', + decimals: '18', burnable: false, pausable: false, premint: '0', @@ -38,6 +39,7 @@ export function printERC20(opts: ERC20Options = defaults): string { export interface ERC20Options extends CommonContractOptions { name: string; symbol: string; + decimals: string; burnable?: boolean; pausable?: boolean; premint?: string; @@ -70,7 +72,8 @@ export function buildERC20(opts: ERC20Options): Contract { const allOpts = withDefaults(opts); - addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol)); + const decimals = toUint(opts.decimals, 'decimals', 'u8'); + addBase(c, toByteArray(allOpts.name), toByteArray(allOpts.symbol), decimals); addERC20Mixin(c); if (allOpts.premint) { @@ -183,9 +186,22 @@ function addERC20Mixin(c: ContractBuilder) { }); } -function addBase(c: ContractBuilder, name: string, symbol: string) { - c.addUseClause('openzeppelin::token::erc20', 'DefaultConfig'); +function addBase(c: ContractBuilder, name: string, symbol: string, decimals: bigint) { + // Add ERC20 component c.addComponent(components.ERC20Component, [name, symbol], true); + + // Add immutable config with decimals + const trait: BaseImplementedTrait = { + name: 'ERC20ImmutableConfig', + of: 'ERC20Component::ImmutableConfig', + tags: [], + }; + c.addImplementedTrait(trait); + c.addSuperVariableToTrait(trait, { + name: 'DECIMALS', + type: 'u8', + value: decimals.toString(), + }); } function addBurnable(c: ContractBuilder) { diff --git a/packages/core/cairo_alpha/src/generate/erc20.ts b/packages/core/cairo_alpha/src/generate/erc20.ts index 51659af86..b30d3c9e7 100644 --- a/packages/core/cairo_alpha/src/generate/erc20.ts +++ b/packages/core/cairo_alpha/src/generate/erc20.ts @@ -9,6 +9,7 @@ const booleans = [true, false]; const blueprint = { name: ['MyToken'], symbol: ['MTK'], + decimals: ['18'], burnable: booleans, pausable: booleans, mintable: booleans, diff --git a/packages/ui/src/cairo_alpha/ERC20Controls.svelte b/packages/ui/src/cairo_alpha/ERC20Controls.svelte index 5fe326325..c656317a7 100644 --- a/packages/ui/src/cairo_alpha/ERC20Controls.svelte +++ b/packages/ui/src/cairo_alpha/ERC20Controls.svelte @@ -37,6 +37,14 @@ + + + +