@cofhe/mock-contracts 0.2.1 → 0.3.0

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.
@@ -4,13 +4,20 @@ pragma solidity ^0.8.13;
4
4
  import { Test } from 'forge-std/Test.sol';
5
5
  import { TestBed } from '../contracts/TestBed.sol';
6
6
  import { CoFheTest } from '../contracts/foundry/CoFheTest.sol';
7
- import { FHE, InEuint32, euint8, euint256 } from '@fhenixprotocol/cofhe-contracts/FHE.sol';
7
+ import { FHE, InEuint32, euint8, euint128 } from '@fhenixprotocol/cofhe-contracts/FHE.sol';
8
8
 
9
+ /// @title TestBed Foundry Tests
10
+ /// @notice Foundry-native smoke tests for the CoFHE mock environment and FHE Solidity surface.
11
+ /// @dev This repo deploys `TestBed` inside Foundry tests as a known-good reference contract.
12
+ /// Downstream Foundry users are not required to use `TestBed`; they can deploy/test their own
13
+ /// contracts while inheriting from `CoFheTest` to get helper methods like `createInEuint32(...)`
14
+ /// and `assertHashValue(...)`.
9
15
  contract TestBedTest is Test, CoFheTest {
10
16
  TestBed private testbed;
11
17
 
12
18
  address private user = makeAddr('user');
13
19
 
20
+ /// @notice Deploys a fresh TestBed instance for each test.
14
21
  function setUp() public {
15
22
  // optional ... enable verbose logging from fhe mocks
16
23
  // setLog(true);
@@ -18,6 +25,7 @@ contract TestBedTest is Test, CoFheTest {
18
25
  testbed = new TestBed();
19
26
  }
20
27
 
28
+ /// @notice Fuzz test: create an encrypted input and set it as state.
21
29
  function testSetNumberFuzz(uint32 n) public {
22
30
  InEuint32 memory number = createInEuint32(n, user);
23
31
 
@@ -29,6 +37,7 @@ contract TestBedTest is Test, CoFheTest {
29
37
  assertHashValue(testbed.eNumber(), n);
30
38
  }
31
39
 
40
+ /// @notice Validates that mock arithmetic matches EVM uint8 wraparound behavior.
32
41
  function testOverflow() public {
33
42
  euint8 a = FHE.asEuint8(240);
34
43
  euint8 b = FHE.asEuint8(240);
@@ -37,6 +46,7 @@ contract TestBedTest is Test, CoFheTest {
37
46
  assertHashValue(euint8.unwrap(c), (240 + 240) % 256);
38
47
  }
39
48
 
49
+ /// @notice Validates division by zero behavior in the mock implementation.
40
50
  function testDivideByZero() public {
41
51
  euint8 a = FHE.asEuint8(240);
42
52
  euint8 b = FHE.asEuint8(0);
@@ -45,16 +55,17 @@ contract TestBedTest is Test, CoFheTest {
45
55
  assertHashValue(euint8.unwrap(c), type(uint8).max);
46
56
  }
47
57
 
48
- function test256BitsNoOverflow() public {
49
- euint256 a = FHE.asEuint256(type(uint256).max);
50
- euint256 b = FHE.asEuint256(type(uint256).max);
51
- euint256 c = FHE.add(a, b);
58
+ /// @notice Validates 128-bit addition semantics used by the mock implementation.
59
+ function test128BitsNoOverflow() public {
60
+ euint128 a = FHE.asEuint128(type(uint128).max);
61
+ euint128 b = FHE.asEuint128(type(uint128).max);
62
+ euint128 c = FHE.add(a, b);
52
63
 
53
64
  uint256 expected;
54
65
  unchecked {
55
- expected = type(uint256).max + type(uint256).max;
66
+ expected = type(uint128).max + type(uint128).max;
56
67
  }
57
68
 
58
- assertHashValue(euint256.unwrap(c), expected);
69
+ assertHashValue(euint128.unwrap(c), expected);
59
70
  }
60
71
  }
@@ -1,352 +0,0 @@
1
- // This file is auto-generated by build-artifacts.ts
2
- import { type MockArtifact } from './types';
3
-
4
- export const MockQueryDecrypterArtifact = {
5
- contractName: 'MockQueryDecrypter',
6
- isFixed: true,
7
- fixedAddress: '0x0000000000000000000000000000000000005002',
8
- abi: [
9
- {
10
- type: 'function',
11
- name: 'decodeLowLevelReversion',
12
- inputs: [
13
- {
14
- name: 'data',
15
- type: 'bytes',
16
- internalType: 'bytes',
17
- },
18
- ],
19
- outputs: [
20
- {
21
- name: 'error',
22
- type: 'string',
23
- internalType: 'string',
24
- },
25
- ],
26
- stateMutability: 'pure',
27
- },
28
- {
29
- type: 'function',
30
- name: 'exists',
31
- inputs: [],
32
- outputs: [
33
- {
34
- name: '',
35
- type: 'bool',
36
- internalType: 'bool',
37
- },
38
- ],
39
- stateMutability: 'pure',
40
- },
41
- {
42
- type: 'function',
43
- name: 'initialize',
44
- inputs: [
45
- {
46
- name: '_taskManager',
47
- type: 'address',
48
- internalType: 'address',
49
- },
50
- {
51
- name: '_acl',
52
- type: 'address',
53
- internalType: 'address',
54
- },
55
- ],
56
- outputs: [],
57
- stateMutability: 'nonpayable',
58
- },
59
- {
60
- type: 'function',
61
- name: 'mockAcl',
62
- inputs: [],
63
- outputs: [
64
- {
65
- name: '',
66
- type: 'address',
67
- internalType: 'contract MockACL',
68
- },
69
- ],
70
- stateMutability: 'view',
71
- },
72
- {
73
- type: 'function',
74
- name: 'mockQueryDecrypt',
75
- inputs: [
76
- {
77
- name: 'ctHash',
78
- type: 'uint256',
79
- internalType: 'uint256',
80
- },
81
- {
82
- name: '',
83
- type: 'uint256',
84
- internalType: 'uint256',
85
- },
86
- {
87
- name: 'issuer',
88
- type: 'address',
89
- internalType: 'address',
90
- },
91
- ],
92
- outputs: [
93
- {
94
- name: 'allowed',
95
- type: 'bool',
96
- internalType: 'bool',
97
- },
98
- {
99
- name: 'error',
100
- type: 'string',
101
- internalType: 'string',
102
- },
103
- {
104
- name: '',
105
- type: 'uint256',
106
- internalType: 'uint256',
107
- },
108
- ],
109
- stateMutability: 'view',
110
- },
111
- {
112
- type: 'function',
113
- name: 'mockTaskManager',
114
- inputs: [],
115
- outputs: [
116
- {
117
- name: '',
118
- type: 'address',
119
- internalType: 'contract MockTaskManager',
120
- },
121
- ],
122
- stateMutability: 'view',
123
- },
124
- {
125
- type: 'function',
126
- name: 'queryDecrypt',
127
- inputs: [
128
- {
129
- name: 'ctHash',
130
- type: 'uint256',
131
- internalType: 'uint256',
132
- },
133
- {
134
- name: '',
135
- type: 'uint256',
136
- internalType: 'uint256',
137
- },
138
- {
139
- name: 'permission',
140
- type: 'tuple',
141
- internalType: 'struct Permission',
142
- components: [
143
- {
144
- name: 'issuer',
145
- type: 'address',
146
- internalType: 'address',
147
- },
148
- {
149
- name: 'expiration',
150
- type: 'uint64',
151
- internalType: 'uint64',
152
- },
153
- {
154
- name: 'recipient',
155
- type: 'address',
156
- internalType: 'address',
157
- },
158
- {
159
- name: 'validatorId',
160
- type: 'uint256',
161
- internalType: 'uint256',
162
- },
163
- {
164
- name: 'validatorContract',
165
- type: 'address',
166
- internalType: 'address',
167
- },
168
- {
169
- name: 'sealingKey',
170
- type: 'bytes32',
171
- internalType: 'bytes32',
172
- },
173
- {
174
- name: 'issuerSignature',
175
- type: 'bytes',
176
- internalType: 'bytes',
177
- },
178
- {
179
- name: 'recipientSignature',
180
- type: 'bytes',
181
- internalType: 'bytes',
182
- },
183
- ],
184
- },
185
- ],
186
- outputs: [
187
- {
188
- name: 'allowed',
189
- type: 'bool',
190
- internalType: 'bool',
191
- },
192
- {
193
- name: 'error',
194
- type: 'string',
195
- internalType: 'string',
196
- },
197
- {
198
- name: '',
199
- type: 'uint256',
200
- internalType: 'uint256',
201
- },
202
- ],
203
- stateMutability: 'view',
204
- },
205
- {
206
- type: 'function',
207
- name: 'querySealOutput',
208
- inputs: [
209
- {
210
- name: 'ctHash',
211
- type: 'uint256',
212
- internalType: 'uint256',
213
- },
214
- {
215
- name: '',
216
- type: 'uint256',
217
- internalType: 'uint256',
218
- },
219
- {
220
- name: 'permission',
221
- type: 'tuple',
222
- internalType: 'struct Permission',
223
- components: [
224
- {
225
- name: 'issuer',
226
- type: 'address',
227
- internalType: 'address',
228
- },
229
- {
230
- name: 'expiration',
231
- type: 'uint64',
232
- internalType: 'uint64',
233
- },
234
- {
235
- name: 'recipient',
236
- type: 'address',
237
- internalType: 'address',
238
- },
239
- {
240
- name: 'validatorId',
241
- type: 'uint256',
242
- internalType: 'uint256',
243
- },
244
- {
245
- name: 'validatorContract',
246
- type: 'address',
247
- internalType: 'address',
248
- },
249
- {
250
- name: 'sealingKey',
251
- type: 'bytes32',
252
- internalType: 'bytes32',
253
- },
254
- {
255
- name: 'issuerSignature',
256
- type: 'bytes',
257
- internalType: 'bytes',
258
- },
259
- {
260
- name: 'recipientSignature',
261
- type: 'bytes',
262
- internalType: 'bytes',
263
- },
264
- ],
265
- },
266
- ],
267
- outputs: [
268
- {
269
- name: 'allowed',
270
- type: 'bool',
271
- internalType: 'bool',
272
- },
273
- {
274
- name: 'error',
275
- type: 'string',
276
- internalType: 'string',
277
- },
278
- {
279
- name: '',
280
- type: 'bytes32',
281
- internalType: 'bytes32',
282
- },
283
- ],
284
- stateMutability: 'view',
285
- },
286
- {
287
- type: 'function',
288
- name: 'seal',
289
- inputs: [
290
- {
291
- name: 'input',
292
- type: 'uint256',
293
- internalType: 'uint256',
294
- },
295
- {
296
- name: 'key',
297
- type: 'bytes32',
298
- internalType: 'bytes32',
299
- },
300
- ],
301
- outputs: [
302
- {
303
- name: '',
304
- type: 'bytes32',
305
- internalType: 'bytes32',
306
- },
307
- ],
308
- stateMutability: 'pure',
309
- },
310
- {
311
- type: 'function',
312
- name: 'unseal',
313
- inputs: [
314
- {
315
- name: 'hashed',
316
- type: 'bytes32',
317
- internalType: 'bytes32',
318
- },
319
- {
320
- name: 'key',
321
- type: 'bytes32',
322
- internalType: 'bytes32',
323
- },
324
- ],
325
- outputs: [
326
- {
327
- name: '',
328
- type: 'uint256',
329
- internalType: 'uint256',
330
- },
331
- ],
332
- stateMutability: 'pure',
333
- },
334
- {
335
- type: 'error',
336
- name: 'NotAllowed',
337
- inputs: [],
338
- },
339
- {
340
- type: 'error',
341
- name: 'SealingKeyInvalid',
342
- inputs: [],
343
- },
344
- {
345
- type: 'error',
346
- name: 'SealingKeyMissing',
347
- inputs: [],
348
- },
349
- ],
350
- deployedBytecode:
351
- '0x608060405234801561000f575f5ffd5b506004361061009c575f3560e01c80637e0f4b5b116100645780637e0f4b5b1461015a5780638a5c8c7f14610178578063a02eb534146101a8578063a0639f54146101da578063ff6957d31461020c5761009c565b806309ba3156146100a05780631a1992a9146100d2578063267c4ae414610102578063485cc955146101205780634cdc014d1461013c575b5f5ffd5b6100ba60048036038101906100b591906110b5565b61023c565b6040516100c9939291906111aa565b60405180910390f35b6100ec60048036038101906100e791906111e6565b61051f565b6040516100f99190611224565b60405180910390f35b61010a61052d565b604051610117919061123d565b60405180910390f35b61013a60048036038101906101359190611256565b610535565b005b6101446105b8565b60405161015191906112ef565b60405180910390f35b6101626105dd565b60405161016f9190611328565b60405180910390f35b610192600480360381019061018d9190611341565b610601565b60405161019f919061138e565b60405180910390f35b6101c260048036038101906101bd91906113a7565b61060f565b6040516101d1939291906113f7565b60405180910390f35b6101f460048036038101906101ef91906110b5565b61089e565b604051610203939291906113f7565b60405180910390f35b61022660048036038101906102219190611433565b610b28565b604051610233919061147a565b60405180910390f35b5f60605f5f5f1b8460a001510361027f576040517fb78926d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae79f04a86896040518363ffffffff1660e01b81526004016102dc9291906115dc565b602060405180830381865afa92505050801561031657506040513d601f19601f820116820180604052508101906103139190611634565b60015b6104025761032261166b565b806308c379a003610353575061033661168a565b8061034157506103b8565b5f815f5f1b9450945094505050610516565b634e487b71036103b857610365611719565b9061037057506103b8565b5f5f5f1b6040518060400160405280600581526020017f50616e6963000000000000000000000000000000000000000000000000000000815250909450945094505050610516565b3d805f81146103e2576040519150601f19603f3d011682016040523d82523d5f602084013e6103e7565b606091505b505f6103f282610b28565b5f5f1b9450945094505050610516565b8091505080610452575f5f5f1b6040518060400160405280600a81526020017f4e6f74416c6c6f776564000000000000000000000000000000000000000000008152509093509350935050610516565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c76642b896040518263ffffffff1660e01b81526004016104ac919061138e565b602060405180830381865afa1580156104c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104eb919061174b565b905060016104fd828860a0015161051f565b60405180602001604052805f8152509094509450945050505b93509350939050565b5f81835f1b18905092915050565b5f6001905090565b815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8183185f1c905092915050565b5f60605f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635faa299a88876040518363ffffffff1660e01b8152600401610670929190611785565b602060405180830381865afa9250505080156106aa57506040513d601f19601f820116820180604052508101906106a79190611634565b60015b610790576106b661166b565b806308c379a0036106e557506106ca61168a565b806106d55750610748565b5f815f9450945094505050610895565b634e487b7103610748576106f7611719565b906107025750610748565b5f5f6040518060400160405280600581526020017f50616e6963000000000000000000000000000000000000000000000000000000815250909450945094505050610895565b3d805f8114610772576040519150601f19603f3d011682016040523d82523d5f602084013e610777565b606091505b505f61078282610b28565b5f9450945094505050610895565b80915050806107de575f5f6040518060400160405280600a81526020017f4e6f74416c6c6f776564000000000000000000000000000000000000000000008152509093509350935050610895565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c76642b896040518263ffffffff1660e01b8152600401610838919061138e565b602060405180830381865afa158015610853573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610877919061174b565b905060018160405180602001604052805f8152509094509450945050505b93509350939050565b5f60605f5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ae79f04a86896040518363ffffffff1660e01b81526004016108ff9291906115dc565b602060405180830381865afa92505050801561093957506040513d601f19601f820116820180604052508101906109369190611634565b60015b610a1f5761094561166b565b806308c379a003610974575061095961168a565b8061096457506109d7565b5f815f9450945094505050610b1f565b634e487b71036109d757610986611719565b9061099157506109d7565b5f5f6040518060400160405280600581526020017f50616e6963000000000000000000000000000000000000000000000000000000815250909450945094505050610b1f565b3d805f8114610a01576040519150601f19603f3d011682016040523d82523d5f602084013e610a06565b606091505b505f610a1182610b28565b5f9450945094505050610b1f565b8091505080610a6d575f5f6040518060400160405280600a81526020017f4e6f74416c6c6f776564000000000000000000000000000000000000000000008152509093509350935050610b1f565b60015f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631c76642b896040518263ffffffff1660e01b8152600401610ac8919061138e565b602060405180830381865afa158015610ae3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b07919061174b565b60405180602001604052805f81525090935093509350505b93509350939050565b60605f82610b3590611806565b905063ed0764a160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bc1576040518060400160405280601981526020017f5065726d697373696f6e496e76616c69645f4578706972656400000000000000815250915050610d5f565b634c40eccb60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c2e5760405180606001604052806021815260200161189160219139915050610d5f565b638e143bf760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c9b5760405180606001604052806024815260200161186d60249139915050610d5f565b63cbd3a96660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d25576040518060400160405280601a81526020017f5065726d697373696f6e496e76616c69645f44697361626c6564000000000000815250915050610d5f565b6040518060400160405280600f81526020017f4c6f77204c6576656c204572726f7200000000000000000000000000000000008152509150505b919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b610d8781610d75565b8114610d91575f5ffd5b50565b5f81359050610da281610d7e565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b610df282610dac565b810181811067ffffffffffffffff82111715610e1157610e10610dbc565b5b80604052505050565b5f610e23610d64565b9050610e2f8282610de9565b919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610e6182610e38565b9050919050565b610e7181610e57565b8114610e7b575f5ffd5b50565b5f81359050610e8c81610e68565b92915050565b5f67ffffffffffffffff82169050919050565b610eae81610e92565b8114610eb8575f5ffd5b50565b5f81359050610ec981610ea5565b92915050565b5f819050919050565b610ee181610ecf565b8114610eeb575f5ffd5b50565b5f81359050610efc81610ed8565b92915050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff821115610f2457610f23610dbc565b5b610f2d82610dac565b9050602081019050919050565b828183375f83830152505050565b5f610f5a610f5584610f0a565b610e1a565b905082815260208101848484011115610f7657610f75610f06565b5b610f81848285610f3a565b509392505050565b5f82601f830112610f9d57610f9c610f02565b5b8135610fad848260208601610f48565b91505092915050565b5f6101008284031215610fcc57610fcb610da8565b5b610fd7610100610e1a565b90505f610fe684828501610e7e565b5f830152506020610ff984828501610ebb565b602083015250604061100d84828501610e7e565b604083015250606061102184828501610d94565b606083015250608061103584828501610e7e565b60808301525060a061104984828501610eee565b60a08301525060c082013567ffffffffffffffff81111561106d5761106c610e34565b5b61107984828501610f89565b60c08301525060e082013567ffffffffffffffff81111561109d5761109c610e34565b5b6110a984828501610f89565b60e08301525092915050565b5f5f5f606084860312156110cc576110cb610d6d565b5b5f6110d986828701610d94565b93505060206110ea86828701610d94565b925050604084013567ffffffffffffffff81111561110b5761110a610d71565b5b61111786828701610fb6565b9150509250925092565b5f8115159050919050565b61113581611121565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61116d8261113b565b6111778185611145565b9350611187818560208601611155565b61119081610dac565b840191505092915050565b6111a481610ecf565b82525050565b5f6060820190506111bd5f83018661112c565b81810360208301526111cf8185611163565b90506111de604083018461119b565b949350505050565b5f5f604083850312156111fc576111fb610d6d565b5b5f61120985828601610d94565b925050602061121a85828601610eee565b9150509250929050565b5f6020820190506112375f83018461119b565b92915050565b5f6020820190506112505f83018461112c565b92915050565b5f5f6040838503121561126c5761126b610d6d565b5b5f61127985828601610e7e565b925050602061128a85828601610e7e565b9150509250929050565b5f819050919050565b5f6112b76112b26112ad84610e38565b611294565b610e38565b9050919050565b5f6112c88261129d565b9050919050565b5f6112d9826112be565b9050919050565b6112e9816112cf565b82525050565b5f6020820190506113025f8301846112e0565b92915050565b5f611312826112be565b9050919050565b61132281611308565b82525050565b5f60208201905061133b5f830184611319565b92915050565b5f5f6040838503121561135757611356610d6d565b5b5f61136485828601610eee565b925050602061137585828601610eee565b9150509250929050565b61138881610d75565b82525050565b5f6020820190506113a15f83018461137f565b92915050565b5f5f5f606084860312156113be576113bd610d6d565b5b5f6113cb86828701610d94565b93505060206113dc86828701610d94565b92505060406113ed86828701610e7e565b9150509250925092565b5f60608201905061140a5f83018661112c565b818103602083015261141c8185611163565b905061142b604083018461137f565b949350505050565b5f6020828403121561144857611447610d6d565b5b5f82013567ffffffffffffffff81111561146557611464610d71565b5b61147184828501610f89565b91505092915050565b5f6020820190508181035f8301526114928184611163565b905092915050565b6114a381610e57565b82525050565b6114b281610e92565b82525050565b6114c181610d75565b82525050565b6114d081610ecf565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f6114fa826114d6565b61150481856114e0565b9350611514818560208601611155565b61151d81610dac565b840191505092915050565b5f61010083015f83015161153e5f86018261149a565b50602083015161155160208601826114a9565b506040830151611564604086018261149a565b50606083015161157760608601826114b8565b50608083015161158a608086018261149a565b5060a083015161159d60a08601826114c7565b5060c083015184820360c08601526115b582826114f0565b91505060e083015184820360e08601526115cf82826114f0565b9150508091505092915050565b5f6040820190508181035f8301526115f48185611528565b9050611603602083018461137f565b9392505050565b61161381611121565b811461161d575f5ffd5b50565b5f8151905061162e8161160a565b92915050565b5f6020828403121561164957611648610d6d565b5b5f61165684828501611620565b91505092915050565b5f8160e01c9050919050565b5f60033d11156116875760045f5f3e6116845f5161165f565b90505b90565b5f60443d106117165761169b610d64565b60043d036004823e80513d602482011167ffffffffffffffff821117156116c3575050611716565b808201805167ffffffffffffffff8111156116e15750505050611716565b80602083010160043d0385018111156116fe575050505050611716565b61170d82602001850186610de9565b82955050505050505b90565b5f5f60233d111561173357602060045f3e600191505f5190505b9091565b5f8151905061174581610d7e565b92915050565b5f602082840312156117605761175f610d6d565b5b5f61176d84828501611737565b91505092915050565b61177f81610e57565b82525050565b5f6040820190506117985f83018561137f565b6117a56020830184611776565b9392505050565b5f819050602082019050919050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b5f6117f182516117bb565b80915050919050565b5f82821b905092915050565b5f611810826114d6565b8261181a846117ac565b9050611825816117e6565b92506004821015611865576118607fffffffff00000000000000000000000000000000000000000000000000000000836004036008026117fa565b831692505b505091905056fe5065726d697373696f6e496e76616c69645f526563697069656e745369676e61747572655065726d697373696f6e496e76616c69645f4973737565725369676e6174757265a2646970667358221220ea7aaacf8df597acf06d11b043b93f49496ae268dcfd4e421962c00a017689f664736f6c63430008210033',
352
- } satisfies MockArtifact;