@openzeppelin/confidential-contracts 0.2.0-rc.1

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.
Files changed (31) hide show
  1. package/README.md +24 -0
  2. package/build/contracts/Checkpoints.json +16 -0
  3. package/build/contracts/CheckpointsConfidential.json +16 -0
  4. package/build/contracts/ConfidentialFungibleToken.json +614 -0
  5. package/build/contracts/ConfidentialFungibleTokenERC20Wrapper.json +793 -0
  6. package/build/contracts/ConfidentialFungibleTokenUtils.json +10 -0
  7. package/build/contracts/ConfidentialFungibleTokenVotes.json +1002 -0
  8. package/build/contracts/ERC7821WithExecutor.json +145 -0
  9. package/build/contracts/IConfidentialFungibleToken.json +458 -0
  10. package/build/contracts/IConfidentialFungibleTokenReceiver.json +45 -0
  11. package/build/contracts/TFHESafeMath.json +10 -0
  12. package/build/contracts/VestingWalletCliffConfidential.json +275 -0
  13. package/build/contracts/VestingWalletCliffExecutorConfidential.json +424 -0
  14. package/build/contracts/VestingWalletCliffExecutorConfidentialFactory.json +290 -0
  15. package/build/contracts/VestingWalletConfidential.json +246 -0
  16. package/build/contracts/VotesConfidential.json +412 -0
  17. package/finance/ERC7821WithExecutor.sol +46 -0
  18. package/finance/VestingWalletCliffConfidential.sol +62 -0
  19. package/finance/VestingWalletCliffExecutorConfidentialFactory.sol +203 -0
  20. package/finance/VestingWalletConfidential.sol +130 -0
  21. package/governance/utils/VotesConfidential.sol +202 -0
  22. package/interfaces/IConfidentialFungibleToken.sol +135 -0
  23. package/interfaces/IConfidentialFungibleTokenReceiver.sol +19 -0
  24. package/package.json +39 -0
  25. package/token/ConfidentialFungibleToken.sol +314 -0
  26. package/token/extensions/ConfidentialFungibleTokenERC20Wrapper.sol +175 -0
  27. package/token/extensions/ConfidentialFungibleTokenVotes.sol +29 -0
  28. package/token/utils/ConfidentialFungibleTokenUtils.sol +46 -0
  29. package/utils/TFHESafeMath.sol +37 -0
  30. package/utils/structs/CheckpointsConfidential.sol +193 -0
  31. package/utils/structs/temporary-Checkpoints.sol +835 -0
@@ -0,0 +1,424 @@
1
+ {
2
+ "_format": "hh-sol-artifact-1",
3
+ "contractName": "VestingWalletCliffExecutorConfidential",
4
+ "sourceName": "contracts/finance/VestingWalletCliffExecutorConfidentialFactory.sol",
5
+ "abi": [
6
+ {
7
+ "inputs": [],
8
+ "stateMutability": "nonpayable",
9
+ "type": "constructor"
10
+ },
11
+ {
12
+ "inputs": [
13
+ {
14
+ "internalType": "address",
15
+ "name": "sender",
16
+ "type": "address"
17
+ }
18
+ ],
19
+ "name": "AccountUnauthorized",
20
+ "type": "error"
21
+ },
22
+ {
23
+ "inputs": [],
24
+ "name": "ERC7579DecodingError",
25
+ "type": "error"
26
+ },
27
+ {
28
+ "inputs": [
29
+ {
30
+ "internalType": "ExecType",
31
+ "name": "execType",
32
+ "type": "bytes1"
33
+ }
34
+ ],
35
+ "name": "ERC7579UnsupportedExecType",
36
+ "type": "error"
37
+ },
38
+ {
39
+ "inputs": [],
40
+ "name": "FailedCall",
41
+ "type": "error"
42
+ },
43
+ {
44
+ "inputs": [],
45
+ "name": "InvalidInitialization",
46
+ "type": "error"
47
+ },
48
+ {
49
+ "inputs": [],
50
+ "name": "NotInitializing",
51
+ "type": "error"
52
+ },
53
+ {
54
+ "inputs": [],
55
+ "name": "OutOfRangeAccess",
56
+ "type": "error"
57
+ },
58
+ {
59
+ "inputs": [
60
+ {
61
+ "internalType": "address",
62
+ "name": "owner",
63
+ "type": "address"
64
+ }
65
+ ],
66
+ "name": "OwnableInvalidOwner",
67
+ "type": "error"
68
+ },
69
+ {
70
+ "inputs": [
71
+ {
72
+ "internalType": "address",
73
+ "name": "account",
74
+ "type": "address"
75
+ }
76
+ ],
77
+ "name": "OwnableUnauthorizedAccount",
78
+ "type": "error"
79
+ },
80
+ {
81
+ "inputs": [],
82
+ "name": "ReentrancyGuardReentrantCall",
83
+ "type": "error"
84
+ },
85
+ {
86
+ "inputs": [],
87
+ "name": "UnsupportedExecutionMode",
88
+ "type": "error"
89
+ },
90
+ {
91
+ "inputs": [
92
+ {
93
+ "internalType": "uint64",
94
+ "name": "cliffSeconds",
95
+ "type": "uint64"
96
+ },
97
+ {
98
+ "internalType": "uint64",
99
+ "name": "durationSeconds",
100
+ "type": "uint64"
101
+ }
102
+ ],
103
+ "name": "VestingWalletCliffConfidentialInvalidCliffDuration",
104
+ "type": "error"
105
+ },
106
+ {
107
+ "anonymous": false,
108
+ "inputs": [
109
+ {
110
+ "indexed": false,
111
+ "internalType": "uint256",
112
+ "name": "batchExecutionIndex",
113
+ "type": "uint256"
114
+ },
115
+ {
116
+ "indexed": false,
117
+ "internalType": "bytes",
118
+ "name": "returndata",
119
+ "type": "bytes"
120
+ }
121
+ ],
122
+ "name": "ERC7579TryExecuteFail",
123
+ "type": "event"
124
+ },
125
+ {
126
+ "anonymous": false,
127
+ "inputs": [
128
+ {
129
+ "indexed": false,
130
+ "internalType": "uint64",
131
+ "name": "version",
132
+ "type": "uint64"
133
+ }
134
+ ],
135
+ "name": "Initialized",
136
+ "type": "event"
137
+ },
138
+ {
139
+ "anonymous": false,
140
+ "inputs": [
141
+ {
142
+ "indexed": true,
143
+ "internalType": "address",
144
+ "name": "previousOwner",
145
+ "type": "address"
146
+ },
147
+ {
148
+ "indexed": true,
149
+ "internalType": "address",
150
+ "name": "newOwner",
151
+ "type": "address"
152
+ }
153
+ ],
154
+ "name": "OwnershipTransferred",
155
+ "type": "event"
156
+ },
157
+ {
158
+ "anonymous": false,
159
+ "inputs": [
160
+ {
161
+ "indexed": true,
162
+ "internalType": "address",
163
+ "name": "token",
164
+ "type": "address"
165
+ },
166
+ {
167
+ "indexed": false,
168
+ "internalType": "euint64",
169
+ "name": "amount",
170
+ "type": "bytes32"
171
+ }
172
+ ],
173
+ "name": "VestingWalletConfidentialTokenReleased",
174
+ "type": "event"
175
+ },
176
+ {
177
+ "inputs": [],
178
+ "name": "cliff",
179
+ "outputs": [
180
+ {
181
+ "internalType": "uint64",
182
+ "name": "",
183
+ "type": "uint64"
184
+ }
185
+ ],
186
+ "stateMutability": "view",
187
+ "type": "function"
188
+ },
189
+ {
190
+ "inputs": [],
191
+ "name": "duration",
192
+ "outputs": [
193
+ {
194
+ "internalType": "uint64",
195
+ "name": "",
196
+ "type": "uint64"
197
+ }
198
+ ],
199
+ "stateMutability": "view",
200
+ "type": "function"
201
+ },
202
+ {
203
+ "inputs": [],
204
+ "name": "end",
205
+ "outputs": [
206
+ {
207
+ "internalType": "uint64",
208
+ "name": "",
209
+ "type": "uint64"
210
+ }
211
+ ],
212
+ "stateMutability": "view",
213
+ "type": "function"
214
+ },
215
+ {
216
+ "inputs": [
217
+ {
218
+ "internalType": "bytes32",
219
+ "name": "mode",
220
+ "type": "bytes32"
221
+ },
222
+ {
223
+ "internalType": "bytes",
224
+ "name": "executionData",
225
+ "type": "bytes"
226
+ }
227
+ ],
228
+ "name": "execute",
229
+ "outputs": [],
230
+ "stateMutability": "payable",
231
+ "type": "function"
232
+ },
233
+ {
234
+ "inputs": [],
235
+ "name": "executor",
236
+ "outputs": [
237
+ {
238
+ "internalType": "address",
239
+ "name": "",
240
+ "type": "address"
241
+ }
242
+ ],
243
+ "stateMutability": "view",
244
+ "type": "function"
245
+ },
246
+ {
247
+ "inputs": [
248
+ {
249
+ "internalType": "address",
250
+ "name": "beneficiary",
251
+ "type": "address"
252
+ },
253
+ {
254
+ "internalType": "uint48",
255
+ "name": "startTimestamp",
256
+ "type": "uint48"
257
+ },
258
+ {
259
+ "internalType": "uint48",
260
+ "name": "durationSeconds",
261
+ "type": "uint48"
262
+ },
263
+ {
264
+ "internalType": "uint48",
265
+ "name": "cliffSeconds",
266
+ "type": "uint48"
267
+ },
268
+ {
269
+ "internalType": "address",
270
+ "name": "executor",
271
+ "type": "address"
272
+ }
273
+ ],
274
+ "name": "initialize",
275
+ "outputs": [],
276
+ "stateMutability": "nonpayable",
277
+ "type": "function"
278
+ },
279
+ {
280
+ "inputs": [],
281
+ "name": "owner",
282
+ "outputs": [
283
+ {
284
+ "internalType": "address",
285
+ "name": "",
286
+ "type": "address"
287
+ }
288
+ ],
289
+ "stateMutability": "view",
290
+ "type": "function"
291
+ },
292
+ {
293
+ "inputs": [
294
+ {
295
+ "internalType": "address",
296
+ "name": "token",
297
+ "type": "address"
298
+ }
299
+ ],
300
+ "name": "releasable",
301
+ "outputs": [
302
+ {
303
+ "internalType": "euint64",
304
+ "name": "",
305
+ "type": "bytes32"
306
+ }
307
+ ],
308
+ "stateMutability": "nonpayable",
309
+ "type": "function"
310
+ },
311
+ {
312
+ "inputs": [
313
+ {
314
+ "internalType": "address",
315
+ "name": "token",
316
+ "type": "address"
317
+ }
318
+ ],
319
+ "name": "release",
320
+ "outputs": [],
321
+ "stateMutability": "nonpayable",
322
+ "type": "function"
323
+ },
324
+ {
325
+ "inputs": [
326
+ {
327
+ "internalType": "address",
328
+ "name": "token",
329
+ "type": "address"
330
+ }
331
+ ],
332
+ "name": "released",
333
+ "outputs": [
334
+ {
335
+ "internalType": "euint64",
336
+ "name": "",
337
+ "type": "bytes32"
338
+ }
339
+ ],
340
+ "stateMutability": "view",
341
+ "type": "function"
342
+ },
343
+ {
344
+ "inputs": [],
345
+ "name": "renounceOwnership",
346
+ "outputs": [],
347
+ "stateMutability": "nonpayable",
348
+ "type": "function"
349
+ },
350
+ {
351
+ "inputs": [],
352
+ "name": "start",
353
+ "outputs": [
354
+ {
355
+ "internalType": "uint64",
356
+ "name": "",
357
+ "type": "uint64"
358
+ }
359
+ ],
360
+ "stateMutability": "view",
361
+ "type": "function"
362
+ },
363
+ {
364
+ "inputs": [
365
+ {
366
+ "internalType": "bytes32",
367
+ "name": "mode",
368
+ "type": "bytes32"
369
+ }
370
+ ],
371
+ "name": "supportsExecutionMode",
372
+ "outputs": [
373
+ {
374
+ "internalType": "bool",
375
+ "name": "result",
376
+ "type": "bool"
377
+ }
378
+ ],
379
+ "stateMutability": "view",
380
+ "type": "function"
381
+ },
382
+ {
383
+ "inputs": [
384
+ {
385
+ "internalType": "address",
386
+ "name": "newOwner",
387
+ "type": "address"
388
+ }
389
+ ],
390
+ "name": "transferOwnership",
391
+ "outputs": [],
392
+ "stateMutability": "nonpayable",
393
+ "type": "function"
394
+ },
395
+ {
396
+ "inputs": [
397
+ {
398
+ "internalType": "address",
399
+ "name": "token",
400
+ "type": "address"
401
+ },
402
+ {
403
+ "internalType": "uint64",
404
+ "name": "timestamp",
405
+ "type": "uint64"
406
+ }
407
+ ],
408
+ "name": "vestedAmount",
409
+ "outputs": [
410
+ {
411
+ "internalType": "euint128",
412
+ "name": "",
413
+ "type": "bytes32"
414
+ }
415
+ ],
416
+ "stateMutability": "nonpayable",
417
+ "type": "function"
418
+ }
419
+ ],
420
+ "bytecode": "0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6119c0806100d65f395ff3fe6080604052600436106100e4575f3560e01c80639852595c11610087578063d03c791411610057578063d03c791414610290578063e9ae5c53146102bf578063efbe1c1c146102d2578063f2fde38b146102e6575f5ffd5b80639852595c14610202578063a3f8eace14610221578063be9a655514610240578063c34c08e514610254575f5ffd5b80631aaead5e116100c25780631aaead5e14610176578063715018a614610195578063810ec23b146101a95780638da5cb5b146101d6575f5ffd5b80630fb5a6b4146100e857806313d033c0146101195780631916558714610155575b5f5ffd5b3480156100f3575f5ffd5b506100fc610305565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f5ffd5b507f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700546001600160401b03166100fc565b348015610160575f5ffd5b5061017461016f36600461160d565b61033a565b005b348015610181575f5ffd5b5061017461019036600461163b565b61048f565b3480156101a0575f5ffd5b5061017461059e565b3480156101b4575f5ffd5b506101c86101c336600461169c565b6105b1565b604051908152602001610110565b3480156101e1575f5ffd5b506101ea610647565b6040516001600160a01b039091168152602001610110565b34801561020d575f5ffd5b506101c861021c36600461160d565b610675565b34801561022c575f5ffd5b506101c861023b36600461160d565b6106ae565b34801561024b575f5ffd5b506100fc6106d2565b34801561025f575f5ffd5b507f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc00546001600160a01b03166101ea565b34801561029b575f5ffd5b506102af6102aa3660046116dc565b610700565b6040519015158152602001610110565b6101746102cd3660046116f3565b610757565b3480156102dd575f5ffd5b506100fc6107be565b3480156102f1575f5ffd5b5061017461030036600461160d565b6107de565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e84679680154600160401b90046001600160401b031690565b610342610818565b5f61034c826106ae565b90506103588183610885565b505f826001600160a01b0316635bebed7e610371610647565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303815f875af11580156103bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103df9190611768565b90505f6103f46103ee85610675565b83610897565b905061040781610402610647565b6108c5565b50610411816108d0565b50807f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e8467968006001600160a01b0386165f81815260209283526040908190209390935591518481527f2b0c4ec6f49851e91126b16eb680925b819182e196af5660912b8845a868b66d910160405180910390a250505061048c6108df565b50565b5f610498610909565b805490915060ff600160401b82041615906001600160401b03165f811580156104be5750825b90505f826001600160401b031660011480156104d95750303b155b9050811580156104e7575080155b156105055760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561052f57845460ff60401b1916600160401b1785555b61053a8a8a8a610931565b61054387610995565b61054c86610a5a565b831561059257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6105a6610aa3565b6105af5f610ad5565b565b60405163344ff10160e01b81523060048201525f9061063e906106389061062a906001600160a01b0387169063344ff10190602401602060405180830381865afa158015610601573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106259190611768565b610b45565b61063386610675565b610b51565b83610b87565b90505b92915050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081527f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796800602052604090205490565b5f6106416106cd6106bf84426105b1565b6106c885610675565b610be8565b610c1e565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796801546001600160401b031690565b5f5f5f5f61070d85610c2a565b50919450925090506001600160f81b03198316600160f81b14801561073a57506001600160f81b03198216155b801561074e57506001600160e01b03198116155b95945050505050565b61076333848484610c68565b61078757604051637cf8632b60e01b81523360048201526024015b60405180910390fd5b61079083610700565b6107ad57604051637f18127560e01b815260040160405180910390fd5b6107b882825f610cc5565b50505050565b5f6107c7610305565b6107cf6106d2565b6107d99190611793565b905090565b6107e6610aa3565b6001600160a01b03811661080f57604051631e4fbdf760e01b81525f600482015260240161077e565b61048c81610ad5565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c1561085857604051633ee5aeb560e01b815260040160405180910390fd5b6105af60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90610df5565b5f6108908383610dfc565b5090919050565b5f826108a9576108a65f610e70565b92505b816108ba576108b75f610e70565b91505b61063e83835f610e85565b5f6108908383610f32565b5f6108db8230610f32565b5090565b6105af5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061087f565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610641565b610939610f78565b61094283610f9d565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796801805465ffffffffffff9384166fffffffffffffffffffffffffffffffff199091161791909216600160401b0217905550565b61099d610f78565b6109a5610305565b6001600160401b03168165ffffffffffff161115816109c2610305565b90916109fa576040516315956cd160e21b815265ffffffffffff90921660048301526001600160401b0316602482015260440161077e565b50508065ffffffffffff16610a0d6106d2565b610a179190611793565b7f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700805467ffffffffffffffff19166001600160401b039290921691909117905550565b610a62610f78565b7f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc0080546001600160a01b0319166001600160a01b0392909216919091179055565b33610aac610647565b6001600160a01b0316146105af5760405163118cdaa760e01b815233600482015260240161077e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610641826006610fae565b5f82610b6357610b605f611045565b92505b81610b7457610b715f610e70565b91505b61063e83610b8184610b45565b5f610e85565b5f610bb97f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700546001600160401b031690565b6001600160401b0316826001600160401b031610610be057610bdb838361105a565b61063e565b505f92915050565b5f82610bfa57610bf75f611045565b92505b81610c0b57610c085f610e70565b91505b61063e83610c1884610b45565b5f6110ee565b5f610641826005610fae565b5f5f5f5f610c38855f611151565b610c43866001611151565b610c4e876006611189565b610c5988600a6111c1565b93509350935093509193509193565b5f610c9a7f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc00546001600160a01b031690565b6001600160a01b0316856001600160a01b0316148061074e5750306001600160a01b0386161461074e565b6060365f610cd386866111fc565b9092509050806001600160401b03811115610cf057610cf06117b2565b604051908082528060200260200182016040528015610d2357816020015b6060815260200190600190039081610d0e5790505b5092505f5b81811015610deb57610dc68186858585818110610d4757610d476117c6565b9050602002810190610d5991906117da565b610d6790602081019061160d565b868686818110610d7957610d796117c6565b9050602002810190610d8b91906117da565b60200135878787818110610da157610da16117c6565b9050602002810190610db391906117da565b610dc19060408101906117f8565b6112c1565b848281518110610dd857610dd86117c6565b6020908102919091010152600101610d28565b5050509392505050565b80825d5050565b5f51602061194b5f395f51905f528054604051630f8e573b60e21b8152600481018590526001600160a01b03848116602483015290911690633e395cec906044015b5f604051808303815f87803b158015610e55575f5ffd5b505af1158015610e67573d5f5f3e3d5ffd5b50505050505050565b5f610641826001600160401b03166005611353565b5f5f8215610e985750600160f81b610e9b565b505f5b5f51602061196b5f395f51905f525460405163022f65e760e31b81525f51602061194b5f395f51905f52916001600160a01b03169063117b2f3890610ee890899089908790600401611841565b6020604051808303815f875af1158015610f04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190611768565b9695505050505050565b5f51602061194b5f395f51905f528054604051635ca4b5b160e11b8152600481018590526001600160a01b0384811660248301529091169063b9496b6290604401610e3e565b610f806113a2565b6105af57604051631afcd79f60e31b815260040160405180910390fd5b610fa5610f78565b61048c816113bb565b5f51602061196b5f395f51905f52546040516307227b9160e21b81525f915f51602061194b5f395f51905f52916001600160a01b0390911690631c89ee4490610ffd9087908790600401611881565b6020604051808303815f875af1158015611019573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103d9190611768565b949350505050565b5f610641826001600160801b03166006611353565b5f6110636106d2565b6001600160401b0316826001600160401b0316101561108357505f610641565b61108b6107be565b6001600160401b0316826001600160401b0316106110aa575081610641565b6110e76110d1846110b96106d2565b6110c3908661189c565b6001600160401b03166113c3565b6110d9610305565b6001600160401b03166113ea565b9050610641565b5f5f82156111015750600160f81b611104565b505f5b5f51602061196b5f395f51905f52546040516303056db360e31b81525f51602061194b5f395f51905f52916001600160a01b03169063182b6d9890610ee890899089908790600401611841565b5f601f8260ff16111561117757604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160f81b03191690565b5f601c8260ff1611156111af57604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160e01b03191690565b5f600a8260ff1611156111e757604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b69ffffffffffffffffffff191690565b365f8260208110156112215760405163eb0bcc5d60e01b815260040160405180910390fd5b5f61122f60208287896118bb565b611238916118e2565b9050601f19820181111561125f5760405163eb0bcc5d60e01b815260040160405180910390fd5b5f61126f6020830183888a6118bb565b611278916118e2565b90506001600160401b03811180611296575080602002602083850303105b156112b45760405163eb0bcc5d60e01b815260040160405180910390fd5b9501602001959350505050565b60605f806001600160a01b038716156112da57866112dc565b305b6001600160a01b03168686866040516112f69291906118ff565b5f6040518083038185875af1925050503d805f8114611330576040519150601f19603f3d011682016040523d82523d5f602084013e611335565b606091505b50915091506113468989848461140f565b9998505050505050505050565b5f51602061196b5f395f51905f5254604051639cd07acb60e01b81525f915f51602061194b5f395f51905f52916001600160a01b0390911690639cd07acb90610ffd9087908790600401611881565b5f6113ab610909565b54600160401b900460ff16919050565b6107e6610f78565b5f826113d5576113d25f611045565b92505b61063e836001600160801b03841660016114b6565b5f826113fc576113f95f611045565b92505b61063e836001600160801b038416611519565b60606001600160f81b031984166114305761142a83836115ae565b506114ae565b6001600160f81b03198416600160f81b036114895782611484577f2eea2f51f83910481f4b5ba28b7003a6e045d4b59f67dfff8d4c901194050089858360405161147b92919061190e565b60405180910390a15b6114ae565b6040516323a2408560e01b81526001600160f81b03198516600482015260240161077e565b509392505050565b5f5f82156114c95750600160f81b6114cc565b505f5b5f51602061196b5f395f51905f5254604051630afe14ad60e31b81525f51602061194b5f395f51905f52916001600160a01b0316906357f0a56890610ee890899089908790600401611841565b5f51602061196b5f395f51905f5254604051635a53accb60e01b81525f91600160f81b915f51602061194b5f395f51905f52916001600160a01b031690635a53accb9061156e90889088908790600401611841565b6020604051808303815f875af115801561158a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074e9190611768565b6060826115c3576115be826115ca565b610641565b5080610641565b8051156115d957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114611608575f5ffd5b919050565b5f6020828403121561161d575f5ffd5b61063e826115f2565b803565ffffffffffff81168114611608575f5ffd5b5f5f5f5f5f60a0868803121561164f575f5ffd5b611658866115f2565b945061166660208701611626565b935061167460408701611626565b925061168260608701611626565b9150611690608087016115f2565b90509295509295909350565b5f5f604083850312156116ad575f5ffd5b6116b6836115f2565b915060208301356001600160401b03811681146116d1575f5ffd5b809150509250929050565b5f602082840312156116ec575f5ffd5b5035919050565b5f5f5f60408486031215611705575f5ffd5b8335925060208401356001600160401b03811115611721575f5ffd5b8401601f81018613611731575f5ffd5b80356001600160401b03811115611746575f5ffd5b866020828401011115611757575f5ffd5b939660209190910195509293505050565b5f60208284031215611778575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908111156106415761064161177f565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126117ee575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261180d575f5ffd5b8301803591506001600160401b03821115611826575f5ffd5b60200191503681900382131561183a575f5ffd5b9250929050565b92835260208301919091526001600160f81b031916604082015260600190565b6054811061187d57634e487b7160e01b5f52602160045260245ffd5b9052565b828152604081016118956020830184611861565b9392505050565b6001600160401b0382811682821603908111156106415761064161177f565b5f5f858511156118c9575f5ffd5b838611156118d5575f5ffd5b5050820193919092039150565b80356020831015610641575f19602084900360031b1b1692915050565b818382375f9101908152919050565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f830116840101915050939250505056feed8d60e34876f751cc8b014c560745351147d9de11b9347c854e881b128ea600ed8d60e34876f751cc8b014c560745351147d9de11b9347c854e881b128ea601a26469706673582212201f2e93da8f1a5ab45352a4349f38b1910f72f6a840e0b4ef01f718b329d40f0364736f6c634300081d0033",
421
+ "deployedBytecode": "0x6080604052600436106100e4575f3560e01c80639852595c11610087578063d03c791411610057578063d03c791414610290578063e9ae5c53146102bf578063efbe1c1c146102d2578063f2fde38b146102e6575f5ffd5b80639852595c14610202578063a3f8eace14610221578063be9a655514610240578063c34c08e514610254575f5ffd5b80631aaead5e116100c25780631aaead5e14610176578063715018a614610195578063810ec23b146101a95780638da5cb5b146101d6575f5ffd5b80630fb5a6b4146100e857806313d033c0146101195780631916558714610155575b5f5ffd5b3480156100f3575f5ffd5b506100fc610305565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f5ffd5b507f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700546001600160401b03166100fc565b348015610160575f5ffd5b5061017461016f36600461160d565b61033a565b005b348015610181575f5ffd5b5061017461019036600461163b565b61048f565b3480156101a0575f5ffd5b5061017461059e565b3480156101b4575f5ffd5b506101c86101c336600461169c565b6105b1565b604051908152602001610110565b3480156101e1575f5ffd5b506101ea610647565b6040516001600160a01b039091168152602001610110565b34801561020d575f5ffd5b506101c861021c36600461160d565b610675565b34801561022c575f5ffd5b506101c861023b36600461160d565b6106ae565b34801561024b575f5ffd5b506100fc6106d2565b34801561025f575f5ffd5b507f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc00546001600160a01b03166101ea565b34801561029b575f5ffd5b506102af6102aa3660046116dc565b610700565b6040519015158152602001610110565b6101746102cd3660046116f3565b610757565b3480156102dd575f5ffd5b506100fc6107be565b3480156102f1575f5ffd5b5061017461030036600461160d565b6107de565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e84679680154600160401b90046001600160401b031690565b610342610818565b5f61034c826106ae565b90506103588183610885565b505f826001600160a01b0316635bebed7e610371610647565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044016020604051808303815f875af11580156103bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103df9190611768565b90505f6103f46103ee85610675565b83610897565b905061040781610402610647565b6108c5565b50610411816108d0565b50807f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e8467968006001600160a01b0386165f81815260209283526040908190209390935591518481527f2b0c4ec6f49851e91126b16eb680925b819182e196af5660912b8845a868b66d910160405180910390a250505061048c6108df565b50565b5f610498610909565b805490915060ff600160401b82041615906001600160401b03165f811580156104be5750825b90505f826001600160401b031660011480156104d95750303b155b9050811580156104e7575080155b156105055760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561052f57845460ff60401b1916600160401b1785555b61053a8a8a8a610931565b61054387610995565b61054c86610a5a565b831561059257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b6105a6610aa3565b6105af5f610ad5565b565b60405163344ff10160e01b81523060048201525f9061063e906106389061062a906001600160a01b0387169063344ff10190602401602060405180830381865afa158015610601573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106259190611768565b610b45565b61063386610675565b610b51565b83610b87565b90505b92915050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03165f9081527f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796800602052604090205490565b5f6106416106cd6106bf84426105b1565b6106c885610675565b610be8565b610c1e565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796801546001600160401b031690565b5f5f5f5f61070d85610c2a565b50919450925090506001600160f81b03198316600160f81b14801561073a57506001600160f81b03198216155b801561074e57506001600160e01b03198116155b95945050505050565b61076333848484610c68565b61078757604051637cf8632b60e01b81523360048201526024015b60405180910390fd5b61079083610700565b6107ad57604051637f18127560e01b815260040160405180910390fd5b6107b882825f610cc5565b50505050565b5f6107c7610305565b6107cf6106d2565b6107d99190611793565b905090565b6107e6610aa3565b6001600160a01b03811661080f57604051631e4fbdf760e01b81525f600482015260240161077e565b61048c81610ad5565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c1561085857604051633ee5aeb560e01b815260040160405180910390fd5b6105af60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b90610df5565b5f6108908383610dfc565b5090919050565b5f826108a9576108a65f610e70565b92505b816108ba576108b75f610e70565b91505b61063e83835f610e85565b5f6108908383610f32565b5f6108db8230610f32565b5090565b6105af5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061087f565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610641565b610939610f78565b61094283610f9d565b7f78ce9ee9eb65fa0cf5bf10e861c3a95cb7c3c713c96ab1e5323a21e846796801805465ffffffffffff9384166fffffffffffffffffffffffffffffffff199091161791909216600160401b0217905550565b61099d610f78565b6109a5610305565b6001600160401b03168165ffffffffffff161115816109c2610305565b90916109fa576040516315956cd160e21b815265ffffffffffff90921660048301526001600160401b0316602482015260440161077e565b50508065ffffffffffff16610a0d6106d2565b610a179190611793565b7f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700805467ffffffffffffffff19166001600160401b039290921691909117905550565b610a62610f78565b7f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc0080546001600160a01b0319166001600160a01b0392909216919091179055565b33610aac610647565b6001600160a01b0316146105af5760405163118cdaa760e01b815233600482015260240161077e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610641826006610fae565b5f82610b6357610b605f611045565b92505b81610b7457610b715f610e70565b91505b61063e83610b8184610b45565b5f610e85565b5f610bb97f3c715f77db997bdb68403fafb54820cd57dedce553ed6315028656b0d601c700546001600160401b031690565b6001600160401b0316826001600160401b031610610be057610bdb838361105a565b61063e565b505f92915050565b5f82610bfa57610bf75f611045565b92505b81610c0b57610c085f610e70565b91505b61063e83610c1884610b45565b5f6110ee565b5f610641826005610fae565b5f5f5f5f610c38855f611151565b610c43866001611151565b610c4e876006611189565b610c5988600a6111c1565b93509350935093509193509193565b5f610c9a7f246106ffca67a7d3806ba14f6748826b9c39c9fa594b14f83fe454e8e9d0dc00546001600160a01b031690565b6001600160a01b0316856001600160a01b0316148061074e5750306001600160a01b0386161461074e565b6060365f610cd386866111fc565b9092509050806001600160401b03811115610cf057610cf06117b2565b604051908082528060200260200182016040528015610d2357816020015b6060815260200190600190039081610d0e5790505b5092505f5b81811015610deb57610dc68186858585818110610d4757610d476117c6565b9050602002810190610d5991906117da565b610d6790602081019061160d565b868686818110610d7957610d796117c6565b9050602002810190610d8b91906117da565b60200135878787818110610da157610da16117c6565b9050602002810190610db391906117da565b610dc19060408101906117f8565b6112c1565b848281518110610dd857610dd86117c6565b6020908102919091010152600101610d28565b5050509392505050565b80825d5050565b5f51602061194b5f395f51905f528054604051630f8e573b60e21b8152600481018590526001600160a01b03848116602483015290911690633e395cec906044015b5f604051808303815f87803b158015610e55575f5ffd5b505af1158015610e67573d5f5f3e3d5ffd5b50505050505050565b5f610641826001600160401b03166005611353565b5f5f8215610e985750600160f81b610e9b565b505f5b5f51602061196b5f395f51905f525460405163022f65e760e31b81525f51602061194b5f395f51905f52916001600160a01b03169063117b2f3890610ee890899089908790600401611841565b6020604051808303815f875af1158015610f04573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190611768565b9695505050505050565b5f51602061194b5f395f51905f528054604051635ca4b5b160e11b8152600481018590526001600160a01b0384811660248301529091169063b9496b6290604401610e3e565b610f806113a2565b6105af57604051631afcd79f60e31b815260040160405180910390fd5b610fa5610f78565b61048c816113bb565b5f51602061196b5f395f51905f52546040516307227b9160e21b81525f915f51602061194b5f395f51905f52916001600160a01b0390911690631c89ee4490610ffd9087908790600401611881565b6020604051808303815f875af1158015611019573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103d9190611768565b949350505050565b5f610641826001600160801b03166006611353565b5f6110636106d2565b6001600160401b0316826001600160401b0316101561108357505f610641565b61108b6107be565b6001600160401b0316826001600160401b0316106110aa575081610641565b6110e76110d1846110b96106d2565b6110c3908661189c565b6001600160401b03166113c3565b6110d9610305565b6001600160401b03166113ea565b9050610641565b5f5f82156111015750600160f81b611104565b505f5b5f51602061196b5f395f51905f52546040516303056db360e31b81525f51602061194b5f395f51905f52916001600160a01b03169063182b6d9890610ee890899089908790600401611841565b5f601f8260ff16111561117757604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160f81b03191690565b5f601c8260ff1611156111af57604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b6001600160e01b03191690565b5f600a8260ff1611156111e757604051631dd4bb1b60e11b815260040160405180910390fd5b506008021b69ffffffffffffffffffff191690565b365f8260208110156112215760405163eb0bcc5d60e01b815260040160405180910390fd5b5f61122f60208287896118bb565b611238916118e2565b9050601f19820181111561125f5760405163eb0bcc5d60e01b815260040160405180910390fd5b5f61126f6020830183888a6118bb565b611278916118e2565b90506001600160401b03811180611296575080602002602083850303105b156112b45760405163eb0bcc5d60e01b815260040160405180910390fd5b9501602001959350505050565b60605f806001600160a01b038716156112da57866112dc565b305b6001600160a01b03168686866040516112f69291906118ff565b5f6040518083038185875af1925050503d805f8114611330576040519150601f19603f3d011682016040523d82523d5f602084013e611335565b606091505b50915091506113468989848461140f565b9998505050505050505050565b5f51602061196b5f395f51905f5254604051639cd07acb60e01b81525f915f51602061194b5f395f51905f52916001600160a01b0390911690639cd07acb90610ffd9087908790600401611881565b5f6113ab610909565b54600160401b900460ff16919050565b6107e6610f78565b5f826113d5576113d25f611045565b92505b61063e836001600160801b03841660016114b6565b5f826113fc576113f95f611045565b92505b61063e836001600160801b038416611519565b60606001600160f81b031984166114305761142a83836115ae565b506114ae565b6001600160f81b03198416600160f81b036114895782611484577f2eea2f51f83910481f4b5ba28b7003a6e045d4b59f67dfff8d4c901194050089858360405161147b92919061190e565b60405180910390a15b6114ae565b6040516323a2408560e01b81526001600160f81b03198516600482015260240161077e565b509392505050565b5f5f82156114c95750600160f81b6114cc565b505f5b5f51602061196b5f395f51905f5254604051630afe14ad60e31b81525f51602061194b5f395f51905f52916001600160a01b0316906357f0a56890610ee890899089908790600401611841565b5f51602061196b5f395f51905f5254604051635a53accb60e01b81525f91600160f81b915f51602061194b5f395f51905f52916001600160a01b031690635a53accb9061156e90889088908790600401611841565b6020604051808303815f875af115801561158a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074e9190611768565b6060826115c3576115be826115ca565b610641565b5080610641565b8051156115d957805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b80356001600160a01b0381168114611608575f5ffd5b919050565b5f6020828403121561161d575f5ffd5b61063e826115f2565b803565ffffffffffff81168114611608575f5ffd5b5f5f5f5f5f60a0868803121561164f575f5ffd5b611658866115f2565b945061166660208701611626565b935061167460408701611626565b925061168260608701611626565b9150611690608087016115f2565b90509295509295909350565b5f5f604083850312156116ad575f5ffd5b6116b6836115f2565b915060208301356001600160401b03811681146116d1575f5ffd5b809150509250929050565b5f602082840312156116ec575f5ffd5b5035919050565b5f5f5f60408486031215611705575f5ffd5b8335925060208401356001600160401b03811115611721575f5ffd5b8401601f81018613611731575f5ffd5b80356001600160401b03811115611746575f5ffd5b866020828401011115611757575f5ffd5b939660209190910195509293505050565b5f60208284031215611778575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908111156106415761064161177f565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126117ee575f5ffd5b9190910192915050565b5f5f8335601e1984360301811261180d575f5ffd5b8301803591506001600160401b03821115611826575f5ffd5b60200191503681900382131561183a575f5ffd5b9250929050565b92835260208301919091526001600160f81b031916604082015260600190565b6054811061187d57634e487b7160e01b5f52602160045260245ffd5b9052565b828152604081016118956020830184611861565b9392505050565b6001600160401b0382811682821603908111156106415761064161177f565b5f5f858511156118c9575f5ffd5b838611156118d5575f5ffd5b5050820193919092039150565b80356020831015610641575f19602084900360031b1b1692915050565b818382375f9101908152919050565b828152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f830116840101915050939250505056feed8d60e34876f751cc8b014c560745351147d9de11b9347c854e881b128ea600ed8d60e34876f751cc8b014c560745351147d9de11b9347c854e881b128ea601a26469706673582212201f2e93da8f1a5ab45352a4349f38b1910f72f6a840e0b4ef01f718b329d40f0364736f6c634300081d0033",
422
+ "linkReferences": {},
423
+ "deployedLinkReferences": {}
424
+ }