|
| 1 | +use starknet::{ClassHash, ContractAddress}; |
| 2 | + |
1 | 3 | #[starknet::interface]
|
2 | 4 | pub trait IHelloStarknet<TContractState> {
|
3 | 5 | fn increase_balance(ref self: TContractState, amount: felt252);
|
4 | 6 | fn get_balance(self: @TContractState) -> felt252;
|
5 | 7 | fn get_block_number(self: @TContractState) -> u64;
|
6 | 8 | }
|
7 | 9 |
|
| 10 | +#[starknet::interface] |
| 11 | +pub trait ICheatedConstructor<TContractState> { |
| 12 | + fn get_stored_block_number(self: @TContractState) -> u64; |
| 13 | +} |
| 14 | + |
| 15 | +#[starknet::contract] |
| 16 | +pub mod CheatedConstructor { |
| 17 | + use starknet::get_block_number; |
| 18 | + use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess}; |
| 19 | + |
| 20 | + #[storage] |
| 21 | + struct Storage { |
| 22 | + block_number: u64, |
| 23 | + } |
| 24 | + |
| 25 | + #[constructor] |
| 26 | + fn constructor(ref self: ContractState) { |
| 27 | + let block_number = get_block_number(); |
| 28 | + self.block_number.write(block_number); |
| 29 | + } |
| 30 | + |
| 31 | + #[abi(embed_v0)] |
| 32 | + impl ICheatedConstructorImpl of super::ICheatedConstructor<ContractState> { |
| 33 | + fn get_stored_block_number(self: @ContractState) -> u64 { |
| 34 | + self.block_number.read() |
| 35 | + } |
| 36 | + } |
| 37 | +} |
| 38 | + |
8 | 39 | #[starknet::interface]
|
9 | 40 | pub trait IHelloStarknetProxy<TContractState> {
|
10 | 41 | fn get_block_number(self: @TContractState) -> u64;
|
11 | 42 | fn get_block_number_library_call(self: @TContractState) -> u64;
|
| 43 | + fn deploy_cheated_constructor_contract( |
| 44 | + ref self: TContractState, class_hash: ClassHash, salt: felt252, |
| 45 | + ) -> ContractAddress; |
12 | 46 | }
|
13 | 47 |
|
14 | 48 | #[starknet::contract]
|
15 | 49 | pub mod HelloStarknetProxy {
|
16 |
| - use starknet::ContractAddress; |
17 | 50 | use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
|
18 |
| - use starknet::syscalls::get_class_hash_at_syscall; |
| 51 | + use starknet::syscalls::{deploy_syscall, get_class_hash_at_syscall}; |
| 52 | + use starknet::{ClassHash, ContractAddress}; |
19 | 53 | use crate::{
|
20 | 54 | IHelloStarknetDispatcher, IHelloStarknetDispatcherTrait, IHelloStarknetLibraryDispatcher,
|
21 | 55 | };
|
@@ -44,6 +78,13 @@ pub mod HelloStarknetProxy {
|
44 | 78 | let library_dispatcher = IHelloStarknetLibraryDispatcher { class_hash };
|
45 | 79 | library_dispatcher.get_block_number()
|
46 | 80 | }
|
| 81 | + |
| 82 | + fn deploy_cheated_constructor_contract( |
| 83 | + ref self: ContractState, class_hash: ClassHash, salt: felt252, |
| 84 | + ) -> ContractAddress { |
| 85 | + let (address, _) = deploy_syscall(class_hash, salt, array![].span(), false).unwrap(); |
| 86 | + address |
| 87 | + } |
47 | 88 | }
|
48 | 89 | }
|
49 | 90 |
|
|
0 commit comments