Skip to content

Commit 4de6e1d

Browse files
authored
Macros: Test missing ERC4626 traits (#1509)
* Add test cases for missing ERC4626 traits * Update tests to support v2 macros
1 parent 53dfe54 commit 4de6e1d

8 files changed

+747
-10
lines changed

packages/macros/src/tests/snapshots/openzeppelin_macros__tests__test_with_components__with_erc4626.snap

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ TokenStream:
77

88
#[starknet::contract]
99
pub mod ERC4626Mock {
10-
use openzeppelin_token::erc20::ERC20HooksEmptyImpl;
1110
use openzeppelin_token::erc20::extensions::erc4626::{
1211
DefaultConfig, ERC4626DefaultNoFees, ERC4626DefaultNoLimits, ERC4626EmptyHooks,
1312
ERC4626SelfAssetsManagement,
1413
};
14+
use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};
1515
use starknet::ContractAddress;
1616
#[abi(embed_v0)]
1717
impl ERC4626ComponentImpl = ERC4626Component::ERC4626Impl<ContractState>;
@@ -63,14 +63,7 @@ pub mod ERC4626Mock {
6363

6464
Diagnostics:
6565

66-
====
67-
Warning: The ERC20 component requires an ImmutableConfig implementation in scope and
68-
it looks like it is missing.
69-
70-
You can use the default implementation by importing it:
71-
72-
`use openzeppelin_token::erc20::DefaultConfig;`
73-
====
66+
None
7467

7568
AuxData:
7669

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
source: src/tests/test_with_components.rs
3+
expression: result
4+
snapshot_kind: text
5+
---
6+
TokenStream:
7+
8+
#[starknet::contract]
9+
pub mod ERC4626Mock {
10+
use openzeppelin_token::erc20::extensions::erc4626::{
11+
DefaultConfig, ERC4626DefaultNoFees, ERC4626DefaultNoLimits, ERC4626EmptyHooks,
12+
};
13+
use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};
14+
use starknet::ContractAddress;
15+
#[abi(embed_v0)]
16+
impl ERC4626ComponentImpl = ERC4626Component::ERC4626Impl<ContractState>;
17+
#[abi(embed_v0)]
18+
impl ERC4626MetadataImpl = ERC4626Component::ERC4626MetadataImpl<ContractState>;
19+
#[abi(embed_v0)]
20+
impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
21+
#[abi(embed_v0)]
22+
impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
23+
#[storage]
24+
pub struct Storage {
25+
#[substorage(v0)]
26+
pub erc20: ERC20Component::Storage,
27+
#[substorage(v0)]
28+
pub erc4626: ERC4626Component::Storage,
29+
}
30+
#[constructor]
31+
fn constructor(
32+
ref self: ContractState,
33+
name: ByteArray,
34+
symbol: ByteArray,
35+
underlying_asset: ContractAddress,
36+
initial_supply: u256,
37+
recipient: ContractAddress,
38+
) {
39+
self.erc20.initializer(name, symbol);
40+
self.erc20.mint(recipient, initial_supply);
41+
self.erc4626.initializer(underlying_asset);
42+
}
43+
use openzeppelin_token::erc20::ERC20Component;
44+
use openzeppelin_token::erc20::extensions::erc4626::ERC4626Component;
45+
46+
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
47+
component!(path: ERC4626Component, storage: erc4626, event: ERC4626Event);
48+
49+
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;
50+
impl ERC4626InternalImpl = ERC4626Component::InternalImpl<ContractState>;
51+
52+
#[event]
53+
#[derive(Drop, starknet::Event)]
54+
enum Event {
55+
#[flat]
56+
ERC20Event: ERC20Component::Event,
57+
#[flat]
58+
ERC4626Event: ERC4626Component::Event,
59+
}
60+
}
61+
62+
63+
Diagnostics:
64+
65+
====
66+
Warning: The ERC4626 component requires an implementation of the AssetsManagementTrait in scope and
67+
it looks like it is missing.
68+
69+
You can use the ERC4626SelfAssetsManagement implementation by importing it:
70+
71+
`use openzeppelin_token::erc20::extensions::erc4626::ERC4626SelfAssetsManagement;`
72+
====
73+
74+
AuxData:
75+
76+
None
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
---
2+
source: src/tests/test_with_components.rs
3+
expression: result
4+
snapshot_kind: text
5+
---
6+
TokenStream:
7+
8+
#[starknet::contract]
9+
pub mod ERC4626Mock {
10+
use openzeppelin_token::erc20::extensions::erc4626::{
11+
ERC4626DefaultNoFees, ERC4626DefaultNoLimits, ERC4626EmptyHooks,
12+
ERC4626SelfAssetsManagement,
13+
};
14+
use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};
15+
use starknet::ContractAddress;
16+
#[abi(embed_v0)]
17+
impl ERC4626ComponentImpl = ERC4626Component::ERC4626Impl<ContractState>;
18+
#[abi(embed_v0)]
19+
impl ERC4626MetadataImpl = ERC4626Component::ERC4626MetadataImpl<ContractState>;
20+
#[abi(embed_v0)]
21+
impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
22+
#[abi(embed_v0)]
23+
impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
24+
#[storage]
25+
pub struct Storage {
26+
#[substorage(v0)]
27+
pub erc20: ERC20Component::Storage,
28+
#[substorage(v0)]
29+
pub erc4626: ERC4626Component::Storage,
30+
}
31+
#[constructor]
32+
fn constructor(
33+
ref self: ContractState,
34+
name: ByteArray,
35+
symbol: ByteArray,
36+
underlying_asset: ContractAddress,
37+
initial_supply: u256,
38+
recipient: ContractAddress,
39+
) {
40+
self.erc20.initializer(name, symbol);
41+
self.erc20.mint(recipient, initial_supply);
42+
self.erc4626.initializer(underlying_asset);
43+
}
44+
use openzeppelin_token::erc20::ERC20Component;
45+
use openzeppelin_token::erc20::extensions::erc4626::ERC4626Component;
46+
47+
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
48+
component!(path: ERC4626Component, storage: erc4626, event: ERC4626Event);
49+
50+
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;
51+
impl ERC4626InternalImpl = ERC4626Component::InternalImpl<ContractState>;
52+
53+
#[event]
54+
#[derive(Drop, starknet::Event)]
55+
enum Event {
56+
#[flat]
57+
ERC20Event: ERC20Component::Event,
58+
#[flat]
59+
ERC4626Event: ERC4626Component::Event,
60+
}
61+
}
62+
63+
64+
Diagnostics:
65+
66+
====
67+
Warning: The ERC4626 component requires an ImmutableConfig implementation in scope and
68+
it looks like it is missing.
69+
70+
You can use the default implementation by importing it:
71+
72+
`use openzeppelin_token::erc20::extensions::erc4626::DefaultConfig;`
73+
====
74+
75+
AuxData:
76+
77+
None
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
source: src/tests/test_with_components.rs
3+
expression: result
4+
snapshot_kind: text
5+
---
6+
TokenStream:
7+
8+
#[starknet::contract]
9+
pub mod ERC4626Mock {
10+
use openzeppelin_token::erc20::extensions::erc4626::{
11+
DefaultConfig, ERC4626DefaultNoLimits, ERC4626EmptyHooks, ERC4626SelfAssetsManagement,
12+
};
13+
use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};
14+
use starknet::ContractAddress;
15+
#[abi(embed_v0)]
16+
impl ERC4626ComponentImpl = ERC4626Component::ERC4626Impl<ContractState>;
17+
#[abi(embed_v0)]
18+
impl ERC4626MetadataImpl = ERC4626Component::ERC4626MetadataImpl<ContractState>;
19+
#[abi(embed_v0)]
20+
impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
21+
#[abi(embed_v0)]
22+
impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
23+
#[storage]
24+
pub struct Storage {
25+
#[substorage(v0)]
26+
pub erc20: ERC20Component::Storage,
27+
#[substorage(v0)]
28+
pub erc4626: ERC4626Component::Storage,
29+
}
30+
#[constructor]
31+
fn constructor(
32+
ref self: ContractState,
33+
name: ByteArray,
34+
symbol: ByteArray,
35+
underlying_asset: ContractAddress,
36+
initial_supply: u256,
37+
recipient: ContractAddress,
38+
) {
39+
self.erc20.initializer(name, symbol);
40+
self.erc20.mint(recipient, initial_supply);
41+
self.erc4626.initializer(underlying_asset);
42+
}
43+
use openzeppelin_token::erc20::ERC20Component;
44+
use openzeppelin_token::erc20::extensions::erc4626::ERC4626Component;
45+
46+
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
47+
component!(path: ERC4626Component, storage: erc4626, event: ERC4626Event);
48+
49+
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;
50+
impl ERC4626InternalImpl = ERC4626Component::InternalImpl<ContractState>;
51+
52+
#[event]
53+
#[derive(Drop, starknet::Event)]
54+
enum Event {
55+
#[flat]
56+
ERC20Event: ERC20Component::Event,
57+
#[flat]
58+
ERC4626Event: ERC4626Component::Event,
59+
}
60+
}
61+
62+
63+
Diagnostics:
64+
65+
====
66+
Warning: The ERC4626 component requires an implementation of the FeeConfigTrait in scope and
67+
it looks like it is missing.
68+
69+
You can use the ERC4626DefaultNoFees implementation by importing it:
70+
71+
`use openzeppelin_token::erc20::extensions::erc4626::ERC4626DefaultNoFees;`
72+
====
73+
74+
AuxData:
75+
76+
None
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
---
2+
source: src/tests/test_with_components.rs
3+
expression: result
4+
snapshot_kind: text
5+
---
6+
TokenStream:
7+
8+
#[starknet::contract]
9+
pub mod ERC4626Mock {
10+
use openzeppelin_token::erc20::extensions::erc4626::{
11+
DefaultConfig, ERC4626DefaultNoFees, ERC4626DefaultNoLimits, ERC4626SelfAssetsManagement,
12+
};
13+
use openzeppelin_token::erc20::{DefaultConfig as ERC20DefaultConfig, ERC20HooksEmptyImpl};
14+
use starknet::ContractAddress;
15+
#[abi(embed_v0)]
16+
impl ERC4626ComponentImpl = ERC4626Component::ERC4626Impl<ContractState>;
17+
#[abi(embed_v0)]
18+
impl ERC4626MetadataImpl = ERC4626Component::ERC4626MetadataImpl<ContractState>;
19+
#[abi(embed_v0)]
20+
impl ERC20Impl = ERC20Component::ERC20Impl<ContractState>;
21+
#[abi(embed_v0)]
22+
impl ERC20CamelOnlyImpl = ERC20Component::ERC20CamelOnlyImpl<ContractState>;
23+
#[storage]
24+
pub struct Storage {
25+
#[substorage(v0)]
26+
pub erc20: ERC20Component::Storage,
27+
#[substorage(v0)]
28+
pub erc4626: ERC4626Component::Storage,
29+
}
30+
#[constructor]
31+
fn constructor(
32+
ref self: ContractState,
33+
name: ByteArray,
34+
symbol: ByteArray,
35+
underlying_asset: ContractAddress,
36+
initial_supply: u256,
37+
recipient: ContractAddress,
38+
) {
39+
self.erc20.initializer(name, symbol);
40+
self.erc20.mint(recipient, initial_supply);
41+
self.erc4626.initializer(underlying_asset);
42+
}
43+
use openzeppelin_token::erc20::ERC20Component;
44+
use openzeppelin_token::erc20::extensions::erc4626::ERC4626Component;
45+
46+
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
47+
component!(path: ERC4626Component, storage: erc4626, event: ERC4626Event);
48+
49+
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;
50+
impl ERC4626InternalImpl = ERC4626Component::InternalImpl<ContractState>;
51+
52+
#[event]
53+
#[derive(Drop, starknet::Event)]
54+
enum Event {
55+
#[flat]
56+
ERC20Event: ERC20Component::Event,
57+
#[flat]
58+
ERC4626Event: ERC4626Component::Event,
59+
}
60+
}
61+
62+
63+
Diagnostics:
64+
65+
====
66+
Warning: The ERC4626 component requires an implementation of the ERC4626HooksTrait in scope and
67+
it looks like it is missing.
68+
69+
You can use the ERC4626EmptyHooks implementation by importing it:
70+
71+
`use openzeppelin_token::erc20::extensions::erc4626::ERC4626EmptyHooks;`
72+
====
73+
74+
AuxData:
75+
76+
None

0 commit comments

Comments
 (0)