From 7fef37f59b47d6581862a828f92f83d55db98d40 Mon Sep 17 00:00:00 2001 From: Nenad Date: Fri, 21 Feb 2025 11:35:26 +0100 Subject: [PATCH 01/13] add flashmint --- package.json | 3 +- packages/core/stylus/src/contract.ts | 37 ++++-- packages/core/stylus/src/erc20.ts | 127 +++++++++++++++++--- packages/core/stylus/src/generate/erc20.ts | 3 +- packages/core/stylus/src/print.ts | 11 +- packages/ui/src/stylus/ERC20Controls.svelte | 8 ++ 6 files changed, 153 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index c6c359d09..a6f8dd198 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,6 @@ }, "devDependencies": { "wsrun": "^5.2.4" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/packages/core/stylus/src/contract.ts b/packages/core/stylus/src/contract.ts index cad4f1a78..e4a79f9d6 100644 --- a/packages/core/stylus/src/contract.ts +++ b/packages/core/stylus/src/contract.ts @@ -35,6 +35,7 @@ export interface BaseImplementedTrait { * Lower numbers are higher priority, undefined is lowest priority. */ priority?: number; + omit_inherit?: boolean; } export interface ImplementedTrait extends BaseImplementedTrait { @@ -93,7 +94,7 @@ export class ContractBuilder implements Contract { get errors(): Error[] { return [...this.errorsMap.values()]; } - + get constants(): Variable[] { return [...this.constantsMap.values()]; } @@ -105,7 +106,12 @@ export class ContractBuilder implements Contract { const uniqueName = alias.length > 0 ? alias : name; const present = this.useClausesMap.has(uniqueName); if (!present) { - this.useClausesMap.set(uniqueName, { containerPath, name, groupable, alias }); + this.useClausesMap.set(uniqueName, { + containerPath, + name, + groupable, + alias, + }); } } @@ -116,11 +122,8 @@ export class ContractBuilder implements Contract { return existingTrait; } else { const t: ImplementedTrait = { - name: baseTrait.name, + ...baseTrait, functions: [], - storage: baseTrait.storage, - section: baseTrait.section, - priority: baseTrait.priority, }; this.implementedTraitsMap.set(key, t); return t; @@ -144,7 +147,10 @@ export class ContractBuilder implements Contract { return this.implementedTraitsMap.has(name); } - addFunction(baseTrait: BaseImplementedTrait, fn: BaseFunction): ContractFunction { + addFunction( + baseTrait: BaseImplementedTrait, + fn: BaseFunction + ): ContractFunction { const t = this.addImplementedTrait(baseTrait); const signature = this.getFunctionSignature(fn); @@ -152,7 +158,10 @@ export class ContractBuilder implements Contract { // Look for the existing function with the same signature and return it if found for (let i = 0; i < t.functions.length; i++) { const existingFn = t.functions[i]; - if (existingFn !== undefined && this.getFunctionSignature(existingFn) === signature) { + if ( + existingFn !== undefined && + this.getFunctionSignature(existingFn) === signature + ) { return existingFn; } } @@ -170,13 +179,21 @@ export class ContractBuilder implements Contract { return [fn.name, '(', ...fn.args.map(a => a.name), ')'].join(''); } - addFunctionCodeBefore(baseTrait: BaseImplementedTrait, fn: BaseFunction, codeBefore: string[]): void { + addFunctionCodeBefore( + baseTrait: BaseImplementedTrait, + fn: BaseFunction, + codeBefore: string[] + ): void { this.addImplementedTrait(baseTrait); const existingFn = this.addFunction(baseTrait, fn); existingFn.codeBefore = [...(existingFn.codeBefore ?? []), ...codeBefore]; } - addFunctionTag(baseTrait: BaseImplementedTrait, fn: BaseFunction, tag: string): void { + addFunctionTag( + baseTrait: BaseImplementedTrait, + fn: BaseFunction, + tag: string + ): void { this.addImplementedTrait(baseTrait); const existingFn = this.addFunction(baseTrait, fn); existingFn.tag = tag; diff --git a/packages/core/stylus/src/erc20.ts b/packages/core/stylus/src/erc20.ts index 0ea6e6587..7915815a2 100644 --- a/packages/core/stylus/src/erc20.ts +++ b/packages/core/stylus/src/erc20.ts @@ -1,7 +1,11 @@ import { BaseImplementedTrait, Contract, ContractBuilder } from './contract'; import { addPausable } from './add-pausable'; import { defineFunctions } from './utils/define-functions'; -import { CommonContractOptions, withCommonContractDefaults, getSelfArg } from './common-options'; +import { + CommonContractOptions, + withCommonContractDefaults, + getSelfArg, +} from './common-options'; import { contractDefaults as commonDefaults } from './common-options'; import { printContract } from './print'; import { setAccessControl } from './set-access-control'; @@ -12,6 +16,7 @@ export interface ERC20Options extends CommonContractOptions { burnable?: boolean; pausable?: boolean; permit?: boolean; + flashmint?: boolean; } export const defaults: Required = { @@ -19,8 +24,9 @@ export const defaults: Required = { burnable: false, pausable: false, permit: true, + flashmint: false, access: commonDefaults.access, - info: commonDefaults.info + info: commonDefaults.info, } as const; export function printERC20(opts: ERC20Options = defaults): string { @@ -34,6 +40,7 @@ function withDefaults(opts: ERC20Options): Required { burnable: opts.burnable ?? defaults.burnable, pausable: opts.pausable ?? defaults.pausable, permit: opts.permit ?? defaults.permit, + flashmint: opts.flashmint ?? defaults.flashmint, }; } @@ -50,7 +57,7 @@ export function buildERC20(opts: ERC20Options): Contract { const trait = allOpts.permit ? addPermit(c, allOpts.pausable) : addBase(c, allOpts.pausable); - + addMetadata(c); if (allOpts.pausable) { @@ -61,6 +68,10 @@ export function buildERC20(opts: ERC20Options): Contract { addBurnable(c, allOpts.pausable, trait); } + if (allOpts.flashmint) { + addFlashMint(c, allOpts.pausable, trait); + } + setAccessControl(c, allOpts.access); setInfo(c, allOpts.info); @@ -86,7 +97,7 @@ function addBase(c: ContractBuilder, pausable: boolean): BaseImplementedTrait { 'self.pausable.when_not_paused()?;', ]); } - + return erc20Trait; } @@ -96,26 +107,32 @@ function addPermit(c: ContractBuilder, pausable: boolean): BaseImplementedTrait c.addUseClause('openzeppelin_stylus::utils::cryptography::eip712', 'IEip712'); c.addImplementedTrait(erc20PermitTrait); - c.addEip712("ERC-20 Permit Example", "1"); - - if (pausable) { + c.addEip712('ERC-20 Permit Example', '1'); + + if (pausable) { // Add transfer & permit functions with pause checks c.addUseClause('alloc::vec', 'Vec'); c.addUseClause('alloy_primitives', 'Address'); c.addUseClause('alloy_primitives', 'U256'); c.addUseClause('alloy_primitives', 'B256'); - c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).permit, [ - 'self.pausable.when_not_paused()?;', - ]); - c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).transfer, [ - 'self.pausable.when_not_paused()?;', - ]); - c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).transfer_from, [ - 'self.pausable.when_not_paused()?;', - ]); + c.addFunctionCodeBefore( + erc20PermitTrait, + functions(erc20PermitTrait).permit, + ['self.pausable.when_not_paused()?;'] + ); + c.addFunctionCodeBefore( + erc20PermitTrait, + functions(erc20PermitTrait).transfer, + ['self.pausable.when_not_paused()?;'] + ); + c.addFunctionCodeBefore( + erc20PermitTrait, + functions(erc20PermitTrait).transfer_from, + ['self.pausable.when_not_paused()?;'] + ); } - + return erc20PermitTrait; } @@ -144,12 +161,38 @@ function addBurnable(c: ContractBuilder, pausable: boolean, trait: BaseImplement } } +function addFlashMint(c: ContractBuilder, pausable: boolean, baseTrait: BaseImplementedTrait) { + c.addUseClause( + 'openzeppelin_stylus::token::erc20::extensions', + 'Erc20FlashMint' + ); + c.addUseClause( + 'openzeppelin_stylus::token::erc20::extensions', + 'IErc3156FlashLender' + ); + + c.addUseClause('stylus_sdk::abi', 'Bytes'); + + c.addImplementedTrait(flashMintTrait); + + const fns = functions(flashMintTrait, baseTrait); + c.addFunction(flashMintTrait, fns.max_flash_loan); + c.addFunction(flashMintTrait, fns.flash_fee); + c.addFunction(flashMintTrait, fns.flash_loan); + + if (pausable) { + c.addFunctionCodeBefore(flashMintTrait, fns.flash_loan, [ + 'self.pausable.when_not_paused()?;', + ]); + } +} + const erc20Trait: BaseImplementedTrait = { name: 'Erc20', storage: { name: 'erc20', type: 'Erc20', - } + }, }; const erc20PermitTrait: BaseImplementedTrait = { @@ -157,7 +200,16 @@ const erc20PermitTrait: BaseImplementedTrait = { storage: { name: 'erc20_permit', type: 'Erc20Permit', - } + }, +}; + +const flashMintTrait: BaseImplementedTrait = { + name: 'Erc20FlashMint', + storage: { + name: 'flash_mint', + type: 'Erc20FlashMint', + }, + omit_inherit: true }; // const erc20MetadataTrait: BaseImplementedTrait = { @@ -168,7 +220,7 @@ const erc20PermitTrait: BaseImplementedTrait = { // } // } -const functions = (trait: BaseImplementedTrait) => +const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => defineFunctions({ // Token Functions transfer: { @@ -240,4 +292,39 @@ const functions = (trait: BaseImplementedTrait) => `self.${trait.storage.name}.permit(owner, spender, value, deadline, v, r, s).map_err(|e| e.into())`, ], }, + + max_flash_loan: { + args: [ + getSelfArg("immutable"), + { name: 'token', type: 'Address' }, + ], + returns: 'U256', + code: [ + `self.${trait.storage.name}.max_flash_loan(token, &self.${base!.storage.name}).map_err(|e| e.into())`, + ], + }, + flash_fee: { + args: [ + getSelfArg("immutable"), + { name: 'token', type: 'Address' }, + { name: 'value', type: 'U256' }, + ], + returns: 'U256', + code: [ + `self.${trait.storage.name}.flash_fee(token, value).map_err(|e| e.into())`, + ], + }, + flash_loan: { + args: [ + getSelfArg(), + { name: 'receiver', type: 'Address' }, + { name: 'token', type: 'Address' }, + { name: 'value', type: 'U256' }, + { name: 'data', type: 'Bytes' }, + ], + returns: 'Result<(), Vec>', + code: [ + `self.${trait.storage.name}.flash_loan(receiver, token, value, data, &mut self.${base!.storage.name}).map_err(|e| e.into())`, + ], + }, }); diff --git a/packages/core/stylus/src/generate/erc20.ts b/packages/core/stylus/src/generate/erc20.ts index 381ead1a0..c48ed73e4 100644 --- a/packages/core/stylus/src/generate/erc20.ts +++ b/packages/core/stylus/src/generate/erc20.ts @@ -10,8 +10,9 @@ const blueprint = { burnable: booleans, pausable: booleans, permit: booleans, + flashmint: booleans, access: accessOptions, - info: infoOptions + info: infoOptions, }; export function* generateERC20Options(): Generator> { diff --git a/packages/core/stylus/src/print.ts b/packages/core/stylus/src/print.ts index b2f24eea5..5c42c2143 100644 --- a/packages/core/stylus/src/print.ts +++ b/packages/core/stylus/src/print.ts @@ -192,11 +192,14 @@ function printEip712(eip712?: EIP712): Lines[] { } function printImplementedTraits(contractName: string, sortedGroups: [string, ImplementedTrait[]][]): Lines[] { - const traitNames = sortedGroups.flatMap(([_, impls]) => impls).map(trait => trait.name); - + const traitNames = sortedGroups + .flatMap(([_, impls]) => impls) + .filter(trait => !trait.omit_inherit) + .map(trait => trait.name); + const inheritAttribute = traitNames.length > 0 - ? `#[inherit(${traitNames.join(', ')})]` - : "#[inherit]"; + ? `#[inherit(${traitNames.join(', ')})]` + : "#[inherit]"; const header = [ '#[public]', diff --git a/packages/ui/src/stylus/ERC20Controls.svelte b/packages/ui/src/stylus/ERC20Controls.svelte index 712f99c47..a36017c4e 100644 --- a/packages/ui/src/stylus/ERC20Controls.svelte +++ b/packages/ui/src/stylus/ERC20Controls.svelte @@ -59,6 +59,14 @@ Without paying gas, token holders will be able to allow third parties to transfer from their account. + + From 9dfa23a2094830a43b4eee7093c54836604dda82 Mon Sep 17 00:00:00 2001 From: Nenad Date: Fri, 21 Feb 2025 11:43:00 +0100 Subject: [PATCH 02/13] add tests --- packages/core/stylus/src/erc20.test.ts | 30 ++++ packages/core/stylus/src/erc20.test.ts.md | 165 +++++++++++++++++++- packages/core/stylus/src/erc20.test.ts.snap | Bin 890 -> 1187 bytes packages/core/stylus/src/erc20.ts | 21 +-- 4 files changed, 205 insertions(+), 11 deletions(-) diff --git a/packages/core/stylus/src/erc20.test.ts b/packages/core/stylus/src/erc20.test.ts index 9dbd12c36..907643d26 100644 --- a/packages/core/stylus/src/erc20.test.ts +++ b/packages/core/stylus/src/erc20.test.ts @@ -38,6 +38,17 @@ testERC20('erc20 burnable', { burnable: true, }); +testERC20('erc20 flash-mint', { + permit: false, + flashmint: true, +}); + +testERC20('erc20 burnable flash-mint', { + permit: false, + burnable: true, + flashmint: true, +}); + // testERC20('erc20 pausable', { // permit: false, // pausable: true, @@ -49,6 +60,12 @@ testERC20('erc20 burnable', { // pausable: true, // }); +// testERC20('erc20 flash-mint pausable', { +// permit: false, +// flashmint: true, +// pausable: true, +// }); + testERC20('erc20 permit', { permit: true, }); @@ -58,6 +75,11 @@ testERC20('erc20 permit burnable', { burnable: true, }); +testERC20('erc20 permit flash-mint', { + permit: true, + flashmint: true, +}); + // testERC20('erc20 permit pausable', { // permit: true, // pausable: true, @@ -69,10 +91,17 @@ testERC20('erc20 permit burnable', { // pausable: true, // }); +// testERC20('erc20 permit flash-mint pausable', { +// permit: true, +// flashmint: true, +// pausable: true, +// }); + testERC20('erc20 full - complex name', { name: 'Custom $ Token', burnable: true, permit: true, + flashmint: true, // pausable: true, }); @@ -87,6 +116,7 @@ testAPIEquivalence('erc20 API full', { name: 'CustomToken', burnable: true, permit: true, + flashmint: true, // pausable: true, }); diff --git a/packages/core/stylus/src/erc20.test.ts.md b/packages/core/stylus/src/erc20.test.ts.md index f1d704af3..7ea5264f9 100644 --- a/packages/core/stylus/src/erc20.test.ts.md +++ b/packages/core/stylus/src/erc20.test.ts.md @@ -100,6 +100,100 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## erc20 flash-mint + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Stylus ^0.2.0-alpha.3␊ + ␊ + #![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊ + extern crate alloc;␊ + ␊ + use openzeppelin_stylus::token::erc20::{Erc20, IErc20};␊ + use openzeppelin_stylus::token::erc20::extensions::{Erc20FlashMint, IErc3156FlashLender};␊ + use stylus_sdk::abi::Bytes;␊ + use stylus_sdk::prelude::{entrypoint, public, storage};␊ + ␊ + #[entrypoint]␊ + #[storage]␊ + struct MyToken {␊ + #[borrow]␊ + erc20: Erc20,␊ + #[borrow]␊ + flash_mint: Erc20FlashMint,␊ + }␊ + ␊ + #[public]␊ + #[inherit(Erc20)]␊ + impl MyToken {␊ + fn max_flash_loan(&self, token: Address) -> U256 {␊ + self.flash_mint.max_flash_loan(token, &self.erc20).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20).map_err(|e| e.into())␊ + }␊ + }␊ + ` + +## erc20 burnable flash-mint + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Stylus ^0.2.0-alpha.3␊ + ␊ + #![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊ + extern crate alloc;␊ + ␊ + use alloc::vec::Vec;␊ + use alloy_primitives::{Address, U256};␊ + use openzeppelin_stylus::token::erc20::{Erc20, IErc20};␊ + use openzeppelin_stylus::token::erc20::extensions::{␊ + Erc20FlashMint, IErc20Burnable, IErc3156FlashLender␊ + };␊ + use stylus_sdk::abi::Bytes;␊ + use stylus_sdk::prelude::{entrypoint, public, storage};␊ + ␊ + #[entrypoint]␊ + #[storage]␊ + struct MyToken {␊ + #[borrow]␊ + erc20: Erc20,␊ + #[borrow]␊ + flash_mint: Erc20FlashMint,␊ + }␊ + ␊ + #[public]␊ + #[inherit(Erc20)]␊ + impl MyToken {␊ + fn burn(&mut self, value: U256) -> Result<(), Vec> {␊ + self.erc20.burn(value).map_err(|e| e.into())␊ + }␊ + ␊ + fn burn_from(&mut self, account: Address, value: U256) -> Result<(), Vec> {␊ + self.erc20.burn_from(account, value).map_err(|e| e.into())␊ + }␊ + ␊ + fn max_flash_loan(&self, token: Address) -> U256 {␊ + self.flash_mint.max_flash_loan(token, &self.erc20).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20).map_err(|e| e.into())␊ + }␊ + }␊ + ` + ## erc20 permit > Snapshot 1 @@ -180,6 +274,58 @@ Generated by [AVA](https://avajs.dev). }␊ ` +## erc20 permit flash-mint + +> Snapshot 1 + + `// SPDX-License-Identifier: MIT␊ + // Compatible with OpenZeppelin Contracts for Stylus ^0.2.0-alpha.3␊ + ␊ + #![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊ + extern crate alloc;␊ + ␊ + use openzeppelin_stylus::token::erc20::extensions::{␊ + Erc20FlashMint, Erc20Permit, IErc3156FlashLender␊ + };␊ + use openzeppelin_stylus::token::erc20::IErc20;␊ + use openzeppelin_stylus::utils::cryptography::eip712::IEip712;␊ + use stylus_sdk::abi::Bytes;␊ + use stylus_sdk::prelude::{entrypoint, public, storage};␊ + ␊ + #[entrypoint]␊ + #[storage]␊ + struct MyToken {␊ + #[borrow]␊ + flash_mint: Erc20FlashMint,␊ + #[borrow]␊ + erc20_permit: Erc20Permit,␊ + }␊ + ␊ + #[storage]␊ + struct Eip712 {}␊ + ␊ + impl IEip712 for Eip712 {␊ + const NAME: &'static str = "ERC-20 Permit Example";␊ + const VERSION: &'static str = "1";␊ + }␊ + ␊ + #[public]␊ + #[inherit(Erc20Permit)]␊ + impl MyToken {␊ + fn max_flash_loan(&self, token: Address) -> U256 {␊ + self.flash_mint.max_flash_loan(token, &self.erc20_permit).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20_permit).map_err(|e| e.into())␊ + }␊ + }␊ + ` + ## erc20 full - complex name > Snapshot 1 @@ -192,14 +338,19 @@ Generated by [AVA](https://avajs.dev). ␊ use alloc::vec::Vec;␊ use alloy_primitives::{Address, U256};␊ - use openzeppelin_stylus::token::erc20::extensions::{Erc20Permit, IErc20Burnable};␊ + use openzeppelin_stylus::token::erc20::extensions::{␊ + Erc20FlashMint, Erc20Permit, IErc20Burnable, IErc3156FlashLender␊ + };␊ use openzeppelin_stylus::token::erc20::IErc20;␊ use openzeppelin_stylus::utils::cryptography::eip712::IEip712;␊ + use stylus_sdk::abi::Bytes;␊ use stylus_sdk::prelude::{entrypoint, public, storage};␊ ␊ #[entrypoint]␊ #[storage]␊ struct CustomToken {␊ + #[borrow]␊ + flash_mint: Erc20FlashMint,␊ #[borrow]␊ erc20_permit: Erc20Permit,␊ }␊ @@ -215,6 +366,18 @@ Generated by [AVA](https://avajs.dev). #[public]␊ #[inherit(Erc20Permit)]␊ impl CustomToken {␊ + fn max_flash_loan(&self, token: Address) -> U256 {␊ + self.flash_mint.max_flash_loan(token, &self.erc20_permit).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ + }␊ + ␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20_permit).map_err(|e| e.into())␊ + }␊ + ␊ fn burn(&mut self, value: U256) -> Result<(), Vec> {␊ self.erc20_permit.burn(value).map_err(|e| e.into())␊ }␊ diff --git a/packages/core/stylus/src/erc20.test.ts.snap b/packages/core/stylus/src/erc20.test.ts.snap index 826ed3e9b29cf4030272ca4b23af91162d520dfd..c6e034e0bf75e7b96b0096a9ce402b422d462e6d 100644 GIT binary patch literal 1187 zcmV;U1YG+;RzVJVd&{UJm4NPvu-Vo zB`ZUJTOW%E00000000B+SW9o)MiBNhL3!)3x2X-d5JX=PK~yP zE3BxYweWJ6*j?IE9UXe?&q!`P_SPTKV{bk7j}+Xc^{`}BiCa5L$O|Pd=dm;MeVp0X zVV%q1ME~*z4Ko~1>Qu7;Pz4)nObZ(8rZoEJ*Np}>^!wT0=4bBCq}S}?%%^j2W>;5X z|Haqem7cNyg~rlO1BGEBLq%YB=cTv03RM}!)UY~7IAf*>&tnunU>qZ70;*CNMFXQD zlnVAunF)*{M8@yNrLK_wti)F4pKWl-_FL?g%;#ZQ?dHEm53V&n-5LhSwtIp0q2 zKJ3_gr()&Yt2Ny?AtYAFlLiuUj>4#RESWGq#7UjAzz1!lqQ}^&c;511?}a08`7m2L z^0ZM&U|_fXGPMln9st1dVO=UE&yMUr=L|SsyiTgjSx6Nz(L}{e!LAmMJQl^gr>)~< zd5szv(uA9z4MIK5Jtvh|{D6)M*Y@l5XeLr0^Q7B z%O9sdQ<~`-?_C#gu>)Mlscx1cCd@G87WM`pS6!H9$lVZZoQ`kOsP0-sq{{BC-+y2q zJw?$#HKJ#sbwWv)=4d`lkBD57T*n*5pC6+QZA_|tT=qQz+Rxk0wP7m zWd!uRDPPiK75K2y1IlD*bt*!{(Vh(B^k3ZS>B~HN3+Ct#OOHAf2FOlRsC9iBZx*kpv?JoPYJ{$brkL97o-v@Z;*Tre(p(*(EpL?H- zVzFK~Fp|~0oYwMo<0|iRw*Q#fo;$L4(`|mvk)LyXyyqNAKNQ9scPtzXVB*PC&tCs? z&oexKxoli+TPD|-BW&sr_Fp$(Sp?s=KCIuZYn=X^4bafo;j2DCMEg@cd|iJK8lsmg zrl8v+nOmQ^#?4eYUES6(SQg@ZKDx>IXriDG9g2ks=TL$`rq$R2L8B23;+?++c=?Yz z)6B~^*&t59=@XuGec&8lO|+3w&hziW^TV;rxjyIm!6_l1Qm*_U{sZcg;6?%`0005@ BMMnSt literal 890 zcmV-=1BLuSRzVfpI%c=-qe zv^zP>V;_qM00000000B+Ro!kIMHJ3Y5z^jq$=xB5idV9o)Cj1?AyS)KRV30>Nr@e-lZHCAQzTV+_=)sX$sW_el+RXJr<7O}zSXVHN$+7mo^u-9R5_j6C2qySH@=w|0& zr_tJk(jjz4Jhuwh+B3ML&cWgC{*$ZFdu#1$r++?)cXL6<0zf}F&HDg)-mj_-oaG` z|81*yHmncW$fHk79m;}I&;VhIK8-;0{B2tFVor +const functions = (baseTrait: BaseImplementedTrait) => defineFunctions({ // Token Functions transfer: { @@ -231,7 +232,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'Result>', code: [ - `self.${trait.storage.name}.transfer(to, value).map_err(|e| e.into())`, + `self.${baseTrait.storage.name}.transfer(to, value).map_err(|e| e.into())`, ], }, transfer_from: { @@ -243,7 +244,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'Result>', code: [ - `self.${trait.storage.name}.transfer_from(from, to, value).map_err(|e| e.into())`, + `self.${baseTrait.storage.name}.transfer_from(from, to, value).map_err(|e| e.into())`, ], }, @@ -262,7 +263,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => burn: { args: [getSelfArg(), { name: 'value', type: 'U256' }], returns: 'Result<(), Vec>', - code: [`self.${trait.storage.name}.burn(value).map_err(|e| e.into())`], + code: [`self.${baseTrait.storage.name}.burn(value).map_err(|e| e.into())`], }, burn_from: { args: [ @@ -272,7 +273,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'Result<(), Vec>', code: [ - `self.${trait.storage.name}.burn_from(account, value).map_err(|e| e.into())`, + `self.${baseTrait.storage.name}.burn_from(account, value).map_err(|e| e.into())`, ], }, @@ -289,7 +290,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'Result<(), Vec>', code: [ - `self.${trait.storage.name}.permit(owner, spender, value, deadline, v, r, s).map_err(|e| e.into())`, + `self.${baseTrait.storage.name}.permit(owner, spender, value, deadline, v, r, s).map_err(|e| e.into())`, ], }, @@ -300,7 +301,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'U256', code: [ - `self.${trait.storage.name}.max_flash_loan(token, &self.${base!.storage.name}).map_err(|e| e.into())`, + `self.flash_mint.max_flash_loan(token, &self.${baseTrait.storage.name}).map_err(|e| e.into())`, ], }, flash_fee: { @@ -311,7 +312,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'U256', code: [ - `self.${trait.storage.name}.flash_fee(token, value).map_err(|e| e.into())`, + `self.flash_mint.flash_fee(token, value).map_err(|e| e.into())`, ], }, flash_loan: { @@ -324,7 +325,7 @@ const functions = (trait: BaseImplementedTrait, base?: BaseImplementedTrait) => ], returns: 'Result<(), Vec>', code: [ - `self.${trait.storage.name}.flash_loan(receiver, token, value, data, &mut self.${base!.storage.name}).map_err(|e| e.into())`, + `self.flash_mint.flash_loan(receiver, token, value, data, &mut self.${baseTrait.storage.name}).map_err(|e| e.into())`, ], }, }); From f7530ecfcfacda7e0176e815c479e3125fa64eb3 Mon Sep 17 00:00:00 2001 From: Nenad Date: Fri, 21 Feb 2025 11:49:18 +0100 Subject: [PATCH 03/13] remove formatting --- package.json | 3 +-- packages/core/stylus/src/erc20.ts | 40 +++++++++++-------------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index a6f8dd198..c6c359d09 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,5 @@ }, "devDependencies": { "wsrun": "^5.2.4" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + } } diff --git a/packages/core/stylus/src/erc20.ts b/packages/core/stylus/src/erc20.ts index c8d76c5b9..8f0f45a28 100644 --- a/packages/core/stylus/src/erc20.ts +++ b/packages/core/stylus/src/erc20.ts @@ -1,11 +1,7 @@ import { BaseImplementedTrait, Contract, ContractBuilder } from './contract'; import { addPausable } from './add-pausable'; import { defineFunctions } from './utils/define-functions'; -import { - CommonContractOptions, - withCommonContractDefaults, - getSelfArg, -} from './common-options'; +import { CommonContractOptions, withCommonContractDefaults, getSelfArg } from './common-options'; import { contractDefaults as commonDefaults } from './common-options'; import { printContract } from './print'; import { setAccessControl } from './set-access-control'; @@ -116,21 +112,15 @@ function addPermit(c: ContractBuilder, pausable: boolean): BaseImplementedTrait c.addUseClause('alloy_primitives', 'U256'); c.addUseClause('alloy_primitives', 'B256'); - c.addFunctionCodeBefore( - erc20PermitTrait, - functions(erc20PermitTrait).permit, - ['self.pausable.when_not_paused()?;'] - ); - c.addFunctionCodeBefore( - erc20PermitTrait, - functions(erc20PermitTrait).transfer, - ['self.pausable.when_not_paused()?;'] - ); - c.addFunctionCodeBefore( - erc20PermitTrait, - functions(erc20PermitTrait).transfer_from, - ['self.pausable.when_not_paused()?;'] - ); + c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).permit, [ + 'self.pausable.when_not_paused()?;', + ]); + c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).transfer, [ + 'self.pausable.when_not_paused()?;', + ]); + c.addFunctionCodeBefore(erc20PermitTrait, functions(erc20PermitTrait).transfer_from, [ + 'self.pausable.when_not_paused()?;', + ]); } return erc20PermitTrait; @@ -175,14 +165,12 @@ function addFlashMint(c: ContractBuilder, pausable: boolean, baseTrait: BaseImpl c.addImplementedTrait(flashMintTrait); - const fns = functions(baseTrait); - - c.addFunction(flashMintTrait, fns.max_flash_loan); - c.addFunction(flashMintTrait, fns.flash_fee); - c.addFunction(flashMintTrait, fns.flash_loan); + c.addFunction(flashMintTrait, functions(baseTrait).max_flash_loan); + c.addFunction(flashMintTrait, functions(baseTrait).flash_fee); + c.addFunction(flashMintTrait, functions(baseTrait).flash_loan); if (pausable) { - c.addFunctionCodeBefore(flashMintTrait, fns.flash_loan, [ + c.addFunctionCodeBefore(flashMintTrait, functions(baseTrait).flash_loan, [ 'self.pausable.when_not_paused()?;', ]); } From 313ed68a3b99edf78ce4964238a6d23f19e46827 Mon Sep 17 00:00:00 2001 From: Nenad Date: Fri, 21 Feb 2025 11:51:26 +0100 Subject: [PATCH 04/13] remove formatting --- packages/core/stylus/src/contract.ts | 29 +++++----------------------- 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/packages/core/stylus/src/contract.ts b/packages/core/stylus/src/contract.ts index e4a79f9d6..be8f4d7a1 100644 --- a/packages/core/stylus/src/contract.ts +++ b/packages/core/stylus/src/contract.ts @@ -106,12 +106,7 @@ export class ContractBuilder implements Contract { const uniqueName = alias.length > 0 ? alias : name; const present = this.useClausesMap.has(uniqueName); if (!present) { - this.useClausesMap.set(uniqueName, { - containerPath, - name, - groupable, - alias, - }); + this.useClausesMap.set(uniqueName, { containerPath, name, groupable, alias }); } } @@ -147,10 +142,7 @@ export class ContractBuilder implements Contract { return this.implementedTraitsMap.has(name); } - addFunction( - baseTrait: BaseImplementedTrait, - fn: BaseFunction - ): ContractFunction { + addFunction(baseTrait: BaseImplementedTrait, fn: BaseFunction): ContractFunction { const t = this.addImplementedTrait(baseTrait); const signature = this.getFunctionSignature(fn); @@ -158,10 +150,7 @@ export class ContractBuilder implements Contract { // Look for the existing function with the same signature and return it if found for (let i = 0; i < t.functions.length; i++) { const existingFn = t.functions[i]; - if ( - existingFn !== undefined && - this.getFunctionSignature(existingFn) === signature - ) { + if (existingFn !== undefined && this.getFunctionSignature(existingFn) === signature) { return existingFn; } } @@ -179,21 +168,13 @@ export class ContractBuilder implements Contract { return [fn.name, '(', ...fn.args.map(a => a.name), ')'].join(''); } - addFunctionCodeBefore( - baseTrait: BaseImplementedTrait, - fn: BaseFunction, - codeBefore: string[] - ): void { + addFunctionCodeBefore(baseTrait: BaseImplementedTrait, fn: BaseFunction, codeBefore: string[]): void { this.addImplementedTrait(baseTrait); const existingFn = this.addFunction(baseTrait, fn); existingFn.codeBefore = [...(existingFn.codeBefore ?? []), ...codeBefore]; } - addFunctionTag( - baseTrait: BaseImplementedTrait, - fn: BaseFunction, - tag: string - ): void { + addFunctionTag(baseTrait: BaseImplementedTrait, fn: BaseFunction, tag: string): void { this.addImplementedTrait(baseTrait); const existingFn = this.addFunction(baseTrait, fn); existingFn.tag = tag; From 2ed5bb891e7674d96fd1a15d4161da0ed1faa37e Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:22:34 +0100 Subject: [PATCH 05/13] fix flashmint fn templates --- package.json | 3 ++- packages/core/stylus/src/erc20.test.ts.md | 24 ++++++++++---------- packages/core/stylus/src/erc20.test.ts.snap | Bin 1187 -> 1192 bytes packages/core/stylus/src/erc20.ts | 20 ++++++---------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index c6c359d09..a6f8dd198 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,6 @@ }, "devDependencies": { "wsrun": "^5.2.4" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/packages/core/stylus/src/erc20.test.ts.md b/packages/core/stylus/src/erc20.test.ts.md index 7ea5264f9..9b97293ca 100644 --- a/packages/core/stylus/src/erc20.test.ts.md +++ b/packages/core/stylus/src/erc20.test.ts.md @@ -128,14 +128,14 @@ Generated by [AVA](https://avajs.dev). #[inherit(Erc20)]␊ impl MyToken {␊ fn max_flash_loan(&self, token: Address) -> U256 {␊ - self.flash_mint.max_flash_loan(token, &self.erc20).map_err(|e| e.into())␊ + self.flash_mint.max_flash_loan(token, &self.erc20)␊ }␊ ␊ - fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + fn flash_fee(&self, token: Address, value: U256) -> Result> {␊ self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ }␊ ␊ - fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result> {␊ self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20).map_err(|e| e.into())␊ }␊ }␊ @@ -181,14 +181,14 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ fn max_flash_loan(&self, token: Address) -> U256 {␊ - self.flash_mint.max_flash_loan(token, &self.erc20).map_err(|e| e.into())␊ + self.flash_mint.max_flash_loan(token, &self.erc20)␊ }␊ ␊ - fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + fn flash_fee(&self, token: Address, value: U256) -> Result> {␊ self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ }␊ ␊ - fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result> {␊ self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20).map_err(|e| e.into())␊ }␊ }␊ @@ -313,14 +313,14 @@ Generated by [AVA](https://avajs.dev). #[inherit(Erc20Permit)]␊ impl MyToken {␊ fn max_flash_loan(&self, token: Address) -> U256 {␊ - self.flash_mint.max_flash_loan(token, &self.erc20_permit).map_err(|e| e.into())␊ + self.flash_mint.max_flash_loan(token, &self.erc20_permit)␊ }␊ ␊ - fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + fn flash_fee(&self, token: Address, value: U256) -> Result> {␊ self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ }␊ ␊ - fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result> {␊ self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20_permit).map_err(|e| e.into())␊ }␊ }␊ @@ -367,14 +367,14 @@ Generated by [AVA](https://avajs.dev). #[inherit(Erc20Permit)]␊ impl CustomToken {␊ fn max_flash_loan(&self, token: Address) -> U256 {␊ - self.flash_mint.max_flash_loan(token, &self.erc20_permit).map_err(|e| e.into())␊ + self.flash_mint.max_flash_loan(token, &self.erc20_permit)␊ }␊ ␊ - fn flash_fee(&self, token: Address, value: U256) -> U256 {␊ + fn flash_fee(&self, token: Address, value: U256) -> Result> {␊ self.flash_mint.flash_fee(token, value).map_err(|e| e.into())␊ }␊ ␊ - fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result<(), Vec> {␊ + fn flash_loan(&mut self, receiver: Address, token: Address, value: U256, data: Bytes) -> Result> {␊ self.flash_mint.flash_loan(receiver, token, value, data, &mut self.erc20_permit).map_err(|e| e.into())␊ }␊ ␊ diff --git a/packages/core/stylus/src/erc20.test.ts.snap b/packages/core/stylus/src/erc20.test.ts.snap index c6e034e0bf75e7b96b0096a9ce402b422d462e6d..d68333652750ddfc1d4bc42cadd5fd9cbdd36b4c 100644 GIT binary patch literal 1192 zcmV;Z1Xue(RzVTo zcR{UYEy7%KL2_-Wjt)KcXC#N-d+3koy@%fWM~daHEy;R7j$1p5SC^HRoCjy-`!vJ1 zL5)lQMF08@4Ko~1YE&~HQ2A>sObZ(6hBW$@xAi(T^oQx+XQv)cC7$S7I44X2Hs9`mZaK=mnb|Mr%ViX}~0yd>Eiuy)F zAQkMJ7LPUjv{GIxuaqc{8npb#aTY&6^n+uM8lwtAngSKAfqy zC0b((#i9#BdLd<^c;sNypc3FKY7i*r(yus9tPx~{;^)i}Pg~Q374qBc4U90&Oqvm(@vD777|5FG*B^9u&c!*hlLUEXlpxJ zUc)*DH0EYlW@rBC$?RV zC9w2`HquD7fvaUk=TG1p|k;esAF!{3q=uFJoZ{TxRx0 z{-pXdrJ1hL-dzGNN&y#esvD({3DXa`xt$)!eLXkHkh>+=q&mJ$qPlGnktln#`uK@` z^%6xL)qtLb))*nrTL$$9fwca0TPI#pC)uXX5#JA&A#Hl8QZA_|ET#BJ1ABoE3y1_6 zR}s+hrhG+@Rp7!>2Pju@nQjgc2iqKq$mI8MOm=zHF_1ZP4bte2NQX5P`p8ZblwCSG z!f6*0^b)Y;)O~`Ql>8beuwGo4&ManzQWGv*`j~}!JnCtF*868al7!~}=pmus<|mni zCg6Yn-1%e>g>_nift2RtoR;?*!@SF>{@zkOPnkZQYx5h9{D$NH-f+a-P#AI1F?Y~| zi5C++b^Xr`PyghVX5(tlGQP$fVH1b2|GN9iBKV;-Vcl-s;NIt~hlWN@US1Co?N0RM zb@M5xk6wn1KzBzncRp~98mMx*x~mJYEX4V6bZf)WMZ~Xn9Tvo#LkWDDlwuPE4F`0G z5B}~U`&6fW5 GCIA2<{xQ1% literal 1187 zcmV;U1YG+;RzVJVd&{UJm4NPvu-Vo zB`ZUJTOW%E00000000B+SW9o)MiBNhL3!)3x2X-d5JX=PK~yP zE3BxYweWJ6*j?IE9UXe?&q!`P_SPTKV{bk7j}+Xc^{`}BiCa5L$O|Pd=dm;MeVp0X zVV%q1ME~*z4Ko~1>Qu7;Pz4)nObZ(8rZoEJ*Np}>^!wT0=4bBCq}S}?%%^j2W>;5X z|Haqem7cNyg~rlO1BGEBLq%YB=cTv03RM}!)UY~7IAf*>&tnunU>qZ70;*CNMFXQD zlnVAunF)*{M8@yNrLK_wti)F4pKWl-_FL?g%;#ZQ?dHEm53V&n-5LhSwtIp0q2 zKJ3_gr()&Yt2Ny?AtYAFlLiuUj>4#RESWGq#7UjAzz1!lqQ}^&c;511?}a08`7m2L z^0ZM&U|_fXGPMln9st1dVO=UE&yMUr=L|SsyiTgjSx6Nz(L}{e!LAmMJQl^gr>)~< zd5szv(uA9z4MIK5Jtvh|{D6)M*Y@l5XeLr0^Q7B z%O9sdQ<~`-?_C#gu>)Mlscx1cCd@G87WM`pS6!H9$lVZZoQ`kOsP0-sq{{BC-+y2q zJw?$#HKJ#sbwWv)=4d`lkBD57T*n*5pC6+QZA_|tT=qQz+Rxk0wP7m zWd!uRDPPiK75K2y1IlD*bt*!{(Vh(B^k3ZS>B~HN3+Ct#OOHAf2FOlRsC9iBZx*kpv?JoPYJ{$brkL97o-v@Z;*Tre(p(*(EpL?H- zVzFK~Fp|~0oYwMo<0|iRw*Q#fo;$L4(`|mvk)LyXyyqNAKNQ9scPtzXVB*PC&tCs? z&oexKxoli+TPD|-BW&sr_Fp$(Sp?s=KCIuZYn=X^4bafo;j2DCMEg@cd|iJK8lsmg zrl8v+nOmQ^#?4eYUES6(SQg@ZKDx>IXriDG9g2ks=TL$`rq$R2L8B23;+?++c=?Yz z)6B~^*&t59=@XuGec&8lO|+3w&hziW^TV;rxjyIm!6_l1Qm*_U{sZcg;6?%`0005@ BMMnSt diff --git a/packages/core/stylus/src/erc20.ts b/packages/core/stylus/src/erc20.ts index 8f0f45a28..58de67f2f 100644 --- a/packages/core/stylus/src/erc20.ts +++ b/packages/core/stylus/src/erc20.ts @@ -152,14 +152,8 @@ function addBurnable(c: ContractBuilder, pausable: boolean, trait: BaseImplement } function addFlashMint(c: ContractBuilder, pausable: boolean, baseTrait: BaseImplementedTrait) { - c.addUseClause( - 'openzeppelin_stylus::token::erc20::extensions', - 'Erc20FlashMint' - ); - c.addUseClause( - 'openzeppelin_stylus::token::erc20::extensions', - 'IErc3156FlashLender' - ); + c.addUseClause('openzeppelin_stylus::token::erc20::extensions', 'Erc20FlashMint'); + c.addUseClause('openzeppelin_stylus::token::erc20::extensions', 'IErc3156FlashLender'); c.addUseClause('stylus_sdk::abi', 'Bytes'); @@ -289,7 +283,7 @@ const functions = (baseTrait: BaseImplementedTrait) => ], returns: 'U256', code: [ - `self.flash_mint.max_flash_loan(token, &self.${baseTrait.storage.name}).map_err(|e| e.into())`, + `self.${flashMintTrait.storage.name}.max_flash_loan(token, &self.${baseTrait.storage.name})`, ], }, flash_fee: { @@ -298,9 +292,9 @@ const functions = (baseTrait: BaseImplementedTrait) => { name: 'token', type: 'Address' }, { name: 'value', type: 'U256' }, ], - returns: 'U256', + returns: 'Result>', code: [ - `self.flash_mint.flash_fee(token, value).map_err(|e| e.into())`, + `self.${flashMintTrait.storage.name}.flash_fee(token, value).map_err(|e| e.into())`, ], }, flash_loan: { @@ -311,9 +305,9 @@ const functions = (baseTrait: BaseImplementedTrait) => { name: 'value', type: 'U256' }, { name: 'data', type: 'Bytes' }, ], - returns: 'Result<(), Vec>', + returns: 'Result>', code: [ - `self.flash_mint.flash_loan(receiver, token, value, data, &mut self.${baseTrait.storage.name}).map_err(|e| e.into())`, + `self.${flashMintTrait.storage.name}.flash_loan(receiver, token, value, data, &mut self.${baseTrait.storage.name}).map_err(|e| e.into())`, ], }, }); From 3aba59f8dbd175759f8faac5fcc579f53442e27d Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:22:45 +0100 Subject: [PATCH 06/13] revert package.json --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index a6f8dd198..c6c359d09 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,5 @@ }, "devDependencies": { "wsrun": "^5.2.4" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + } } From 80d681044801cff777872b259b1cf0b5e915f447 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:24:38 +0100 Subject: [PATCH 07/13] add package.json to .gitignore --- .gitignore | 2 ++ .vscode/settings.json | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index c61302beb..abb739cd2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ node_modules .env .env.local + +package.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..97924983a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnSave": false +} \ No newline at end of file From 2e1e7c9763987b67110459f88a7e3437665c3582 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:25:29 +0100 Subject: [PATCH 08/13] remove vscode settings --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 97924983a..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "editor.formatOnSave": false -} \ No newline at end of file From cf86313db1e923cda4bef77d8e5dddc461b9d646 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:26:39 +0100 Subject: [PATCH 09/13] Revert "remove vscode settings" This reverts commit 2e1e7c9763987b67110459f88a7e3437665c3582. --- .vscode/settings.json | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..97924983a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnSave": false +} \ No newline at end of file From 992098c7250d12e5230a1800f464250180be19c2 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:26:41 +0100 Subject: [PATCH 10/13] Revert "add package.json to .gitignore" This reverts commit 80d681044801cff777872b259b1cf0b5e915f447. --- .gitignore | 2 -- .vscode/settings.json | 3 --- 2 files changed, 5 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index abb739cd2..c61302beb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,3 @@ node_modules .env .env.local - -package.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 97924983a..000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "editor.formatOnSave": false -} \ No newline at end of file From 794d29c7ef96d24466079898ee01db6ec3b7a680 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:26:42 +0100 Subject: [PATCH 11/13] Revert "revert package.json" This reverts commit 3aba59f8dbd175759f8faac5fcc579f53442e27d. --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c6c359d09..a6f8dd198 100644 --- a/package.json +++ b/package.json @@ -16,5 +16,6 @@ }, "devDependencies": { "wsrun": "^5.2.4" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } From 4dea702cdb1c3a5a7567bf9ae4fe82a0933f8e04 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:31:48 +0100 Subject: [PATCH 12/13] revert package.json --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index a6f8dd198..c6c359d09 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,5 @@ }, "devDependencies": { "wsrun": "^5.2.4" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" + } } From 04354dba1e98d0991388709bc8e1d1db568c70d6 Mon Sep 17 00:00:00 2001 From: Nenad Date: Tue, 25 Feb 2025 21:32:37 +0100 Subject: [PATCH 13/13] add package.json to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c61302beb..ebc56178c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ dist *.tsbuildinfo node_modules - .env .env.local + +package.json