@layerzerolabs/protocol-stellar-v2 0.2.41 → 0.2.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +146 -144
- package/.turbo/turbo-lint.log +165 -96
- package/.turbo/turbo-test.log +1810 -1755
- package/Cargo.lock +22 -127
- package/Cargo.toml +4 -6
- package/contracts/macro-integration-tests/tests/runtime/oapp/mod.rs +3 -5
- package/contracts/macro-integration-tests/tests/runtime/oapp/sender.rs +2 -1
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +1 -1
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_auth_trait.rs +28 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_auth_trait.stderr +397 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.rs +1 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr +10 -10
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_all.rs +1 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/custom_single_trait.rs +4 -0
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/minimal_contract.rs +5 -4
- package/contracts/macro-integration-tests/tests/ui/oapp/pass/struct_with_fields.rs +2 -0
- package/contracts/oapps/counter/src/counter.rs +4 -3
- package/contracts/oapps/oapp/src/oapp_core.rs +1 -1
- package/contracts/oapps/oapp/src/tests/oapp_core.rs +2 -1
- package/contracts/oapps/oapp/src/tests/oapp_options_type3.rs +6 -3
- package/contracts/oapps/oapp/src/tests/oapp_receiver.rs +2 -1
- package/contracts/oapps/oapp/src/tests/oapp_sender.rs +2 -1
- package/contracts/oapps/oapp/src/tests/test_macros.rs +10 -0
- package/contracts/oapps/oapp-macros/src/generators.rs +6 -9
- package/contracts/oapps/oapp-macros/src/lib.rs +1 -1
- package/contracts/oapps/oapp-macros/src/tests/snapshots/oapp_macros__tests__oapp__snapshot_generate_oapp.snap +0 -7
- package/contracts/oapps/oft/src/oft.rs +2 -1
- package/contracts/oapps/oft/src/tests/oft_types/lock_unlock.rs +1 -0
- package/contracts/oapps/oft-core/integration-tests/setup.rs +1 -0
- package/contracts/oapps/oft-core/src/oft_core.rs +2 -2
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +2 -0
- package/docs/oapp-guide.md +14 -9
- package/package.json +5 -4
- package/sdk/.turbo/turbo-test.log +294 -298
- package/sdk/dist/generated/counter.d.ts +137 -137
- package/sdk/dist/generated/counter.js +27 -27
- package/sdk/dist/generated/oft.d.ts +136 -136
- package/sdk/dist/generated/oft.js +27 -27
- package/sdk/package.json +1 -1
- package/ts-bindings-gen.toml +67 -0
- package/tools/ts-bindings-gen/Cargo.toml +0 -16
- package/tools/ts-bindings-gen/src/main.rs +0 -214
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
error[E0412]: cannot find type `MyOAppClient` in this scope
|
|
2
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
3
|
+
|
|
|
4
|
+
12 | #[oapp]
|
|
5
|
+
| ^^^^^^^ not found in this scope
|
|
6
|
+
|
|
|
7
|
+
= note: this error originates in the attribute macro `soroban_sdk::contractclient` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
8
|
+
|
|
9
|
+
error[E0412]: cannot find type `MyOAppArgs` in this scope
|
|
10
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
11
|
+
|
|
|
12
|
+
12 | #[oapp]
|
|
13
|
+
| ^^^^^^^ not found in this scope
|
|
14
|
+
|
|
|
15
|
+
= note: this error originates in the attribute macro `soroban_sdk::contractargs` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
16
|
+
|
|
17
|
+
error[E0412]: cannot find type `MyOAppClient` in this scope
|
|
18
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
19
|
+
|
|
|
20
|
+
12 | #[oapp]
|
|
21
|
+
| ^^^^^^^ not found in this scope
|
|
22
|
+
|
|
|
23
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
24
|
+
|
|
25
|
+
error[E0412]: cannot find type `MyOAppArgs` in this scope
|
|
26
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
27
|
+
|
|
|
28
|
+
12 | #[oapp]
|
|
29
|
+
| ^^^^^^^ not found in this scope
|
|
30
|
+
|
|
|
31
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
32
|
+
|
|
33
|
+
error[E0412]: cannot find type `MyOAppClient` in this scope
|
|
34
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
35
|
+
|
|
|
36
|
+
12 | #[oapp]
|
|
37
|
+
| ^^^^^^^ not found in this scope
|
|
38
|
+
|
|
|
39
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
40
|
+
|
|
41
|
+
error[E0412]: cannot find type `MyOAppArgs` in this scope
|
|
42
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
43
|
+
|
|
|
44
|
+
12 | #[oapp]
|
|
45
|
+
| ^^^^^^^ not found in this scope
|
|
46
|
+
|
|
|
47
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
48
|
+
|
|
49
|
+
error[E0412]: cannot find type `MyOAppClient` in this scope
|
|
50
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
51
|
+
|
|
|
52
|
+
12 | #[oapp]
|
|
53
|
+
| ^^^^^^^ not found in this scope
|
|
54
|
+
|
|
|
55
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
56
|
+
|
|
57
|
+
error[E0412]: cannot find type `MyOAppArgs` in this scope
|
|
58
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
59
|
+
|
|
|
60
|
+
12 | #[oapp]
|
|
61
|
+
| ^^^^^^^ not found in this scope
|
|
62
|
+
|
|
|
63
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
64
|
+
|
|
65
|
+
error[E0412]: cannot find type `MyOAppClient` in this scope
|
|
66
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
67
|
+
|
|
|
68
|
+
12 | #[oapp]
|
|
69
|
+
| ^^^^^^^ not found in this scope
|
|
70
|
+
|
|
|
71
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
72
|
+
|
|
73
|
+
error[E0412]: cannot find type `MyOAppArgs` in this scope
|
|
74
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:12:1
|
|
75
|
+
|
|
|
76
|
+
12 | #[oapp]
|
|
77
|
+
| ^^^^^^^ not found in this scope
|
|
78
|
+
|
|
|
79
|
+
= note: this error originates in the macro `soroban_sdk::contractimpl_trait_default_fns_not_overridden` which comes from the expansion of the attribute macro `oapp` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
80
|
+
|
|
81
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
82
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
83
|
+
|
|
|
84
|
+
13 | pub struct MyOApp;
|
|
85
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
86
|
+
|
|
|
87
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
88
|
+
note: required by a bound in `OAppCore`
|
|
89
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
90
|
+
|
|
|
91
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
92
|
+
| ^^^^^^^ required by this bound in `OAppCore`
|
|
93
|
+
|
|
94
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
95
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
96
|
+
|
|
|
97
|
+
13 | pub struct MyOApp;
|
|
98
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
99
|
+
|
|
|
100
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
101
|
+
note: required by a bound in `RoleBasedAccessControl`
|
|
102
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
103
|
+
|
|
|
104
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
105
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl`
|
|
106
|
+
|
|
107
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
108
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
109
|
+
|
|
|
110
|
+
13 | pub struct MyOApp;
|
|
111
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
112
|
+
|
|
|
113
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
114
|
+
= note: required for `MyOApp` to implement `OAppCore`
|
|
115
|
+
note: required by a bound in `OAppSenderInternal`
|
|
116
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_sender.rs
|
|
117
|
+
|
|
|
118
|
+
| pub trait OAppSenderInternal: OAppCore {
|
|
119
|
+
| ^^^^^^^^ required by this bound in `OAppSenderInternal`
|
|
120
|
+
|
|
121
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
122
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
123
|
+
|
|
|
124
|
+
13 | pub struct MyOApp;
|
|
125
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
126
|
+
|
|
|
127
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
128
|
+
= note: required for `MyOApp` to implement `OAppCore`
|
|
129
|
+
note: required by a bound in `OAppReceiver`
|
|
130
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_receiver.rs
|
|
131
|
+
|
|
|
132
|
+
| pub trait OAppReceiver: OAppCore + LzReceiveInternal {
|
|
133
|
+
| ^^^^^^^^ required by this bound in `OAppReceiver`
|
|
134
|
+
|
|
135
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
136
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
137
|
+
|
|
|
138
|
+
13 | pub struct MyOApp;
|
|
139
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
140
|
+
|
|
|
141
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
142
|
+
= note: required for `MyOApp` to implement `RoleBasedAccessControl`
|
|
143
|
+
note: required by a bound in `OAppOptionsType3`
|
|
144
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_options_type3.rs
|
|
145
|
+
|
|
|
146
|
+
| pub trait OAppOptionsType3: RoleBasedAccessControl {
|
|
147
|
+
| ^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `OAppOptionsType3`
|
|
148
|
+
|
|
149
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
150
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
151
|
+
|
|
|
152
|
+
13 | pub struct MyOApp;
|
|
153
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
154
|
+
|
|
|
155
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
156
|
+
note: required by a bound in `oapp_version`
|
|
157
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
158
|
+
|
|
|
159
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
160
|
+
| ^^^^^^^ required by this bound in `OAppCore::oapp_version`
|
|
161
|
+
...
|
|
162
|
+
| fn oapp_version(_env: &soroban_sdk::Env) -> (u64, u64) {
|
|
163
|
+
| ------------ required by a bound in this associated function
|
|
164
|
+
|
|
165
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
166
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
167
|
+
|
|
|
168
|
+
13 | pub struct MyOApp;
|
|
169
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
170
|
+
|
|
|
171
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
172
|
+
note: required by a bound in `endpoint`
|
|
173
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
174
|
+
|
|
|
175
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
176
|
+
| ^^^^^^^ required by this bound in `OAppCore::endpoint`
|
|
177
|
+
...
|
|
178
|
+
| fn endpoint(env: &soroban_sdk::Env) -> soroban_sdk::Address {
|
|
179
|
+
| -------- required by a bound in this associated function
|
|
180
|
+
|
|
181
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
182
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
183
|
+
|
|
|
184
|
+
13 | pub struct MyOApp;
|
|
185
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
186
|
+
|
|
|
187
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
188
|
+
note: required by a bound in `peer`
|
|
189
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
190
|
+
|
|
|
191
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
192
|
+
| ^^^^^^^ required by this bound in `OAppCore::peer`
|
|
193
|
+
...
|
|
194
|
+
| fn peer(env: &soroban_sdk::Env, eid: u32) -> Option<soroban_sdk::BytesN<32>> {
|
|
195
|
+
| ---- required by a bound in this associated function
|
|
196
|
+
|
|
197
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
198
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
199
|
+
|
|
|
200
|
+
13 | pub struct MyOApp;
|
|
201
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
202
|
+
|
|
|
203
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
204
|
+
note: required by a bound in `set_peer`
|
|
205
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
206
|
+
|
|
|
207
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
208
|
+
| ^^^^^^^ required by this bound in `OAppCore::set_peer`
|
|
209
|
+
...
|
|
210
|
+
| fn set_peer(
|
|
211
|
+
| -------- required by a bound in this associated function
|
|
212
|
+
|
|
213
|
+
error[E0277]: the trait bound `MyOApp: Ownable` is not satisfied
|
|
214
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
215
|
+
|
|
|
216
|
+
13 | pub struct MyOApp;
|
|
217
|
+
| ^^^^^^ the trait `Ownable` is not implemented for `MyOApp`
|
|
218
|
+
|
|
|
219
|
+
= help: the trait `Ownable` is implemented for `EndpointV2`
|
|
220
|
+
note: required by a bound in `oapp::oapp_core::OAppCore::set_delegate`
|
|
221
|
+
--> $WORKSPACE/contracts/oapps/oapp/src/oapp_core.rs
|
|
222
|
+
|
|
|
223
|
+
| pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
224
|
+
| ^^^^^^^ required by this bound in `OAppCore::set_delegate`
|
|
225
|
+
...
|
|
226
|
+
| fn set_delegate(env: &soroban_sdk::Env, delegate: &Option<soroban_sdk::Address>, operator: &soroban_sdk::Address) {
|
|
227
|
+
| ------------ required by a bound in this associated function
|
|
228
|
+
|
|
229
|
+
error[E0277]: the trait bound `MyOApp: ContractFunctionRegister` is not satisfied
|
|
230
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
231
|
+
|
|
|
232
|
+
13 | pub struct MyOApp;
|
|
233
|
+
| ^^^^^^ the trait `ContractFunctionRegister` is not implemented for `MyOApp`
|
|
234
|
+
|
|
|
235
|
+
= help: the following other types implement trait `ContractFunctionRegister`:
|
|
236
|
+
EndpointV2
|
|
237
|
+
MockAuthContract
|
|
238
|
+
|
|
239
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
240
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
241
|
+
|
|
|
242
|
+
13 | pub struct MyOApp;
|
|
243
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
244
|
+
|
|
|
245
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
246
|
+
note: required by a bound in `grant_role`
|
|
247
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
248
|
+
|
|
|
249
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
250
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::grant_role`
|
|
251
|
+
...
|
|
252
|
+
| fn grant_role(
|
|
253
|
+
| ---------- required by a bound in this associated function
|
|
254
|
+
|
|
255
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
256
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
257
|
+
|
|
|
258
|
+
13 | pub struct MyOApp;
|
|
259
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
260
|
+
|
|
|
261
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
262
|
+
note: required by a bound in `revoke_role`
|
|
263
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
264
|
+
|
|
|
265
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
266
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::revoke_role`
|
|
267
|
+
...
|
|
268
|
+
| fn revoke_role(
|
|
269
|
+
| ----------- required by a bound in this associated function
|
|
270
|
+
|
|
271
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
272
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
273
|
+
|
|
|
274
|
+
13 | pub struct MyOApp;
|
|
275
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
276
|
+
|
|
|
277
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
278
|
+
note: required by a bound in `renounce_role`
|
|
279
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
280
|
+
|
|
|
281
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
282
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::renounce_role`
|
|
283
|
+
...
|
|
284
|
+
| fn renounce_role(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol, caller: &soroban_sdk::Address) {
|
|
285
|
+
| ------------- required by a bound in this associated function
|
|
286
|
+
|
|
287
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
288
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
289
|
+
|
|
|
290
|
+
13 | pub struct MyOApp;
|
|
291
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
292
|
+
|
|
|
293
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
294
|
+
note: required by a bound in `set_role_admin`
|
|
295
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
296
|
+
|
|
|
297
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
298
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::set_role_admin`
|
|
299
|
+
...
|
|
300
|
+
| fn set_role_admin(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol, admin_role: &soroban_sdk::Symbol) {
|
|
301
|
+
| -------------- required by a bound in this associated function
|
|
302
|
+
|
|
303
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
304
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
305
|
+
|
|
|
306
|
+
13 | pub struct MyOApp;
|
|
307
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
308
|
+
|
|
|
309
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
310
|
+
note: required by a bound in `remove_role_admin`
|
|
311
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
312
|
+
|
|
|
313
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
314
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::remove_role_admin`
|
|
315
|
+
...
|
|
316
|
+
| fn remove_role_admin(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol) {
|
|
317
|
+
| ----------------- required by a bound in this associated function
|
|
318
|
+
|
|
319
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
320
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
321
|
+
|
|
|
322
|
+
13 | pub struct MyOApp;
|
|
323
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
324
|
+
|
|
|
325
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
326
|
+
note: required by a bound in `has_role`
|
|
327
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
328
|
+
|
|
|
329
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
330
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::has_role`
|
|
331
|
+
...
|
|
332
|
+
| fn has_role(env: &soroban_sdk::Env, account: &soroban_sdk::Address, role: &soroban_sdk::Symbol) -> Option<u32> {
|
|
333
|
+
| -------- required by a bound in this associated function
|
|
334
|
+
|
|
335
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
336
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
337
|
+
|
|
|
338
|
+
13 | pub struct MyOApp;
|
|
339
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
340
|
+
|
|
|
341
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
342
|
+
note: required by a bound in `get_role_admin`
|
|
343
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
344
|
+
|
|
|
345
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
346
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::get_role_admin`
|
|
347
|
+
...
|
|
348
|
+
| fn get_role_admin(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol) -> Option<soroban_sdk::Symbol> {
|
|
349
|
+
| -------------- required by a bound in this associated function
|
|
350
|
+
|
|
351
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
352
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
353
|
+
|
|
|
354
|
+
13 | pub struct MyOApp;
|
|
355
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
356
|
+
|
|
|
357
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
358
|
+
note: required by a bound in `get_role_member_count`
|
|
359
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
360
|
+
|
|
|
361
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
362
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::get_role_member_count`
|
|
363
|
+
...
|
|
364
|
+
| fn get_role_member_count(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol) -> u32 {
|
|
365
|
+
| --------------------- required by a bound in this associated function
|
|
366
|
+
|
|
367
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
368
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
369
|
+
|
|
|
370
|
+
13 | pub struct MyOApp;
|
|
371
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
372
|
+
|
|
|
373
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
374
|
+
note: required by a bound in `get_role_member`
|
|
375
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
376
|
+
|
|
|
377
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
378
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::get_role_member`
|
|
379
|
+
...
|
|
380
|
+
| fn get_role_member(env: &soroban_sdk::Env, role: &soroban_sdk::Symbol, index: u32) -> soroban_sdk::Address {
|
|
381
|
+
| --------------- required by a bound in this associated function
|
|
382
|
+
|
|
383
|
+
error[E0277]: the trait bound `MyOApp: utils::auth::Auth` is not satisfied
|
|
384
|
+
--> tests/ui/oapp/fail/missing_auth_trait.rs:13:12
|
|
385
|
+
|
|
|
386
|
+
13 | pub struct MyOApp;
|
|
387
|
+
| ^^^^^^ the trait `utils::auth::Auth` is not implemented for `MyOApp`
|
|
388
|
+
|
|
|
389
|
+
= help: the trait `utils::auth::Auth` is implemented for `EndpointV2`
|
|
390
|
+
note: required by a bound in `get_existing_roles`
|
|
391
|
+
--> $WORKSPACE/contracts/utils/src/rbac.rs
|
|
392
|
+
|
|
|
393
|
+
| pub trait RoleBasedAccessControl: Auth {
|
|
394
|
+
| ^^^^ required by this bound in `RoleBasedAccessControl::get_existing_roles`
|
|
395
|
+
...
|
|
396
|
+
| fn get_existing_roles(env: &soroban_sdk::Env) -> soroban_sdk::Vec<soroban_sdk::Symbol> {
|
|
397
|
+
| ------------------ required by a bound in this associated function
|
package/contracts/macro-integration-tests/tests/ui/oapp/fail/missing_lz_receive_internal.stderr
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
error[E0277]: the trait bound `MyOApp: LzReceiveInternal` is not satisfied
|
|
2
|
-
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:
|
|
2
|
+
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:7:12
|
|
3
3
|
|
|
|
4
|
-
|
|
4
|
+
7 | pub struct MyOApp;
|
|
5
5
|
| ^^^^^^ the trait `LzReceiveInternal` is not implemented for `MyOApp`
|
|
6
6
|
|
|
|
7
7
|
note: required by a bound in `OAppReceiver`
|
|
@@ -11,9 +11,9 @@ note: required by a bound in `OAppReceiver`
|
|
|
11
11
|
| ^^^^^^^^^^^^^^^^^ required by this bound in `OAppReceiver`
|
|
12
12
|
|
|
13
13
|
error[E0277]: the trait bound `MyOApp: LzReceiveInternal` is not satisfied
|
|
14
|
-
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:
|
|
14
|
+
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:7:12
|
|
15
15
|
|
|
|
16
|
-
|
|
16
|
+
7 | pub struct MyOApp;
|
|
17
17
|
| ^^^^^^ the trait `LzReceiveInternal` is not implemented for `MyOApp`
|
|
18
18
|
|
|
|
19
19
|
note: required by a bound in `oapp::oapp_receiver::OAppReceiver::allow_initialize_path`
|
|
@@ -26,9 +26,9 @@ note: required by a bound in `oapp::oapp_receiver::OAppReceiver::allow_initializ
|
|
|
26
26
|
| --------------------- required by a bound in this associated function
|
|
27
27
|
|
|
28
28
|
error[E0277]: the trait bound `MyOApp: LzReceiveInternal` is not satisfied
|
|
29
|
-
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:
|
|
29
|
+
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:7:12
|
|
30
30
|
|
|
|
31
|
-
|
|
31
|
+
7 | pub struct MyOApp;
|
|
32
32
|
| ^^^^^^ the trait `LzReceiveInternal` is not implemented for `MyOApp`
|
|
33
33
|
|
|
|
34
34
|
note: required by a bound in `oapp::oapp_receiver::OAppReceiver::next_nonce`
|
|
@@ -41,9 +41,9 @@ note: required by a bound in `oapp::oapp_receiver::OAppReceiver::next_nonce`
|
|
|
41
41
|
| ---------- required by a bound in this associated function
|
|
42
42
|
|
|
43
43
|
error[E0277]: the trait bound `MyOApp: LzReceiveInternal` is not satisfied
|
|
44
|
-
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:
|
|
44
|
+
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:7:12
|
|
45
45
|
|
|
|
46
|
-
|
|
46
|
+
7 | pub struct MyOApp;
|
|
47
47
|
| ^^^^^^ the trait `LzReceiveInternal` is not implemented for `MyOApp`
|
|
48
48
|
|
|
|
49
49
|
note: required by a bound in `oapp::oapp_receiver::OAppReceiver::lz_receive`
|
|
@@ -56,9 +56,9 @@ note: required by a bound in `oapp::oapp_receiver::OAppReceiver::lz_receive`
|
|
|
56
56
|
| ---------- required by a bound in this associated function
|
|
57
57
|
|
|
58
58
|
error[E0277]: the trait bound `MyOApp: LzReceiveInternal` is not satisfied
|
|
59
|
-
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:
|
|
59
|
+
--> tests/ui/oapp/fail/missing_lz_receive_internal.rs:7:12
|
|
60
60
|
|
|
|
61
|
-
|
|
61
|
+
7 | pub struct MyOApp;
|
|
62
62
|
| ^^^^^^ the trait `LzReceiveInternal` is not implemented for `MyOApp`
|
|
63
63
|
|
|
|
64
64
|
note: required by a bound in `is_compose_msg_sender`
|
|
@@ -10,6 +10,7 @@ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
|
|
|
10
10
|
use utils::rbac::RoleBasedAccessControl;
|
|
11
11
|
|
|
12
12
|
#[oapp(custom = [core, sender, receiver, options_type3])]
|
|
13
|
+
#[common_macros::lz_contract]
|
|
13
14
|
pub struct MyOApp;
|
|
14
15
|
|
|
15
16
|
impl LzReceiveInternal for MyOApp {
|
|
@@ -16,6 +16,7 @@ use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
|
|
|
16
16
|
use utils::rbac::RoleBasedAccessControl;
|
|
17
17
|
|
|
18
18
|
#[oapp(custom = [core])]
|
|
19
|
+
#[common_macros::lz_contract]
|
|
19
20
|
pub struct MyOAppCustomCore;
|
|
20
21
|
|
|
21
22
|
impl LzReceiveInternal for MyOAppCustomCore {
|
|
@@ -41,6 +42,7 @@ impl OAppCore for MyOAppCustomCore {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
#[oapp(custom = [sender])]
|
|
45
|
+
#[common_macros::lz_contract]
|
|
44
46
|
pub struct MyOAppCustomSender;
|
|
45
47
|
|
|
46
48
|
impl LzReceiveInternal for MyOAppCustomSender {
|
|
@@ -59,6 +61,7 @@ impl LzReceiveInternal for MyOAppCustomSender {
|
|
|
59
61
|
impl OAppSenderInternal for MyOAppCustomSender {}
|
|
60
62
|
|
|
61
63
|
#[oapp(custom = [receiver])]
|
|
64
|
+
#[common_macros::lz_contract]
|
|
62
65
|
pub struct MyOAppCustomReceiver;
|
|
63
66
|
|
|
64
67
|
impl LzReceiveInternal for MyOAppCustomReceiver {
|
|
@@ -78,6 +81,7 @@ impl LzReceiveInternal for MyOAppCustomReceiver {
|
|
|
78
81
|
impl OAppReceiver for MyOAppCustomReceiver {}
|
|
79
82
|
|
|
80
83
|
#[oapp(custom = [options_type3])]
|
|
84
|
+
#[common_macros::lz_contract]
|
|
81
85
|
pub struct MyOAppCustomOptionsType3;
|
|
82
86
|
|
|
83
87
|
impl LzReceiveInternal for MyOAppCustomOptionsType3 {
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
// UI (trybuild) test: minimal `#[oapp]` usage compiles.
|
|
2
2
|
//
|
|
3
3
|
// Purpose:
|
|
4
|
-
// - Verifies `#[oapp]` applies `#[
|
|
5
|
-
//
|
|
6
|
-
// - Verifies the user must implement `LzReceiveInternal` and that the implementation is usable.
|
|
4
|
+
// - Verifies `#[oapp]` generates default trait impls. User applies `#[lz_contract]` for contract + TTL + Auth.
|
|
5
|
+
// - Verifies the user must implement `LzReceiveInternal`.
|
|
7
6
|
|
|
8
7
|
use endpoint_v2::Origin;
|
|
9
8
|
use oapp::oapp_receiver::LzReceiveInternal;
|
|
@@ -11,6 +10,7 @@ use oapp_macros::oapp;
|
|
|
11
10
|
use soroban_sdk::{contractimpl, Address, Bytes, BytesN, Env};
|
|
12
11
|
|
|
13
12
|
#[oapp]
|
|
13
|
+
#[common_macros::lz_contract]
|
|
14
14
|
pub struct MyOApp;
|
|
15
15
|
|
|
16
16
|
impl LzReceiveInternal for MyOApp {
|
|
@@ -30,7 +30,7 @@ impl LzReceiveInternal for MyOApp {
|
|
|
30
30
|
#[contractimpl]
|
|
31
31
|
impl MyOApp {
|
|
32
32
|
pub fn init(env: Env, owner: Address, endpoint: Address) {
|
|
33
|
-
//
|
|
33
|
+
// `#[lz_contract]` (user-provided) provides init_owner and Auth.
|
|
34
34
|
Self::init_owner(&env, &owner);
|
|
35
35
|
oapp::oapp_core::OAppCoreStorage::set_endpoint(&env, &endpoint);
|
|
36
36
|
|
|
@@ -45,6 +45,7 @@ impl MyOApp {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
#[oapp(custom = [])]
|
|
48
|
+
#[common_macros::lz_contract]
|
|
48
49
|
pub struct MyOAppCustomEmpty;
|
|
49
50
|
|
|
50
51
|
impl LzReceiveInternal for MyOAppCustomEmpty {
|
|
@@ -6,6 +6,7 @@ use oapp_macros::oapp;
|
|
|
6
6
|
use soroban_sdk::{Address, Bytes, BytesN, Env};
|
|
7
7
|
|
|
8
8
|
#[oapp]
|
|
9
|
+
#[common_macros::lz_contract]
|
|
9
10
|
#[derive(Clone, Debug)]
|
|
10
11
|
pub struct MyOApp {
|
|
11
12
|
pub x: u32,
|
|
@@ -25,6 +26,7 @@ impl LzReceiveInternal for MyOApp {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
#[oapp]
|
|
29
|
+
#[common_macros::lz_contract]
|
|
28
30
|
pub struct MyOAppTuple(u32, bool);
|
|
29
31
|
|
|
30
32
|
impl LzReceiveInternal for MyOAppTuple {
|
|
@@ -4,26 +4,27 @@ use crate::{
|
|
|
4
4
|
options,
|
|
5
5
|
storage::CounterStorage,
|
|
6
6
|
};
|
|
7
|
-
use common_macros::{contract_impl, only_auth};
|
|
7
|
+
use common_macros::{contract_impl, lz_contract, only_auth};
|
|
8
8
|
use endpoint_v2::{
|
|
9
9
|
ILayerZeroComposer, LayerZeroEndpointV2Client, MessagingChannelClient, MessagingComposerClient, MessagingFee,
|
|
10
10
|
Origin,
|
|
11
11
|
};
|
|
12
12
|
use oapp::{
|
|
13
|
-
oapp_core::{
|
|
13
|
+
oapp_core::{init_ownable_oapp, OAppCore},
|
|
14
14
|
oapp_receiver::{LzReceiveInternal, OAppReceiver},
|
|
15
15
|
oapp_sender::{FeePayer, OAppSenderInternal},
|
|
16
16
|
};
|
|
17
17
|
use oapp_macros::oapp;
|
|
18
18
|
use soroban_sdk::{assert_with_error, panic_with_error, token::TokenClient, Address, Bytes, BytesN, Env};
|
|
19
19
|
|
|
20
|
+
#[lz_contract]
|
|
20
21
|
#[oapp(custom = [receiver])]
|
|
21
22
|
pub struct Counter;
|
|
22
23
|
|
|
23
24
|
#[contract_impl]
|
|
24
25
|
impl Counter {
|
|
25
26
|
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, delegate: &Address) {
|
|
26
|
-
|
|
27
|
+
init_ownable_oapp::<Self>(env, owner, endpoint, delegate);
|
|
27
28
|
let endpoint_client = LayerZeroEndpointV2Client::new(env, endpoint);
|
|
28
29
|
CounterStorage::set_eid(env, &endpoint_client.eid());
|
|
29
30
|
}
|
|
@@ -110,7 +110,7 @@ pub trait OAppCore: Ownable + RoleBasedAccessControl {
|
|
|
110
110
|
/// * `owner` - The address that will own this OApp
|
|
111
111
|
/// * `endpoint` - The LayerZero endpoint address to associate with this OApp
|
|
112
112
|
/// * `delegate` - The delegate address to set on the endpoint for this OApp
|
|
113
|
-
pub fn
|
|
113
|
+
pub fn init_ownable_oapp<T: OAppCore + OwnableInitializer>(
|
|
114
114
|
env: &Env,
|
|
115
115
|
owner: &Address,
|
|
116
116
|
endpoint: &Address,
|
|
@@ -32,6 +32,7 @@ impl DummyEndpoint {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
#[oapp_macros::oapp]
|
|
35
|
+
#[common_macros::lz_contract]
|
|
35
36
|
pub struct DummyOApp;
|
|
36
37
|
|
|
37
38
|
impl LzReceiveInternal for DummyOApp {
|
|
@@ -51,7 +52,7 @@ impl LzReceiveInternal for DummyOApp {
|
|
|
51
52
|
#[contractimpl]
|
|
52
53
|
impl DummyOApp {
|
|
53
54
|
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
|
|
54
|
-
oapp::oapp_core::
|
|
55
|
+
oapp::oapp_core::init_ownable_oapp::<Self>(env, owner, endpoint, owner);
|
|
55
56
|
}
|
|
56
57
|
}
|
|
57
58
|
|
|
@@ -30,6 +30,7 @@ impl DummyEndpoint {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
#[oapp_macros::oapp(custom = [core, sender, receiver])]
|
|
33
|
+
#[common_macros::lz_contract]
|
|
33
34
|
pub struct DummyOAppOptionsType3;
|
|
34
35
|
|
|
35
36
|
#[contract_impl(contracttrait)]
|
|
@@ -58,7 +59,7 @@ impl OAppReceiver for DummyOAppOptionsType3 {}
|
|
|
58
59
|
#[contract_impl]
|
|
59
60
|
impl DummyOAppOptionsType3 {
|
|
60
61
|
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address, delegate: &Address) {
|
|
61
|
-
oapp::oapp_core::
|
|
62
|
+
oapp::oapp_core::init_ownable_oapp::<Self>(env, owner, endpoint, delegate);
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
|
|
@@ -219,7 +220,8 @@ fn test_combine_options_extra_invalid_type_returns_error_when_enforced_present()
|
|
|
219
220
|
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
220
221
|
|
|
221
222
|
let enforced = create_valid_options(&env, &[1, 2, 3]);
|
|
222
|
-
let params =
|
|
223
|
+
let params =
|
|
224
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: Some(enforced) }];
|
|
223
225
|
set_enforced_options_with_auth(&env, &owner, &oapp_client, ¶ms);
|
|
224
226
|
|
|
225
227
|
// extra has wrong option type (not 3) but len >= 2 -> validated and should panic
|
|
@@ -234,7 +236,8 @@ fn test_combine_options_extra_too_short_returns_error_when_enforced_present() {
|
|
|
234
236
|
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
235
237
|
|
|
236
238
|
let enforced = create_valid_options(&env, &[1, 2, 3]);
|
|
237
|
-
let params =
|
|
239
|
+
let params =
|
|
240
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: Some(enforced) }];
|
|
238
241
|
set_enforced_options_with_auth(&env, &owner, &oapp_client, ¶ms);
|
|
239
242
|
|
|
240
243
|
// extra is non-empty but len < 2 -> should panic
|
|
@@ -8,6 +8,7 @@ use soroban_sdk::{
|
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
#[oapp_macros::oapp]
|
|
11
|
+
#[common_macros::lz_contract]
|
|
11
12
|
pub struct DummyOAppReceiver;
|
|
12
13
|
|
|
13
14
|
impl LzReceiveInternal for DummyOAppReceiver {
|
|
@@ -27,7 +28,7 @@ impl LzReceiveInternal for DummyOAppReceiver {
|
|
|
27
28
|
#[contractimpl]
|
|
28
29
|
impl DummyOAppReceiver {
|
|
29
30
|
pub fn __constructor(env: &Env, owner: &Address, endpoint: &Address) {
|
|
30
|
-
oapp::oapp_core::
|
|
31
|
+
oapp::oapp_core::init_ownable_oapp::<Self>(env, owner, endpoint, owner);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
|