@ensuro/core 2.0.1 → 2.1.0-beta1

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.
@@ -107,13 +107,35 @@
107
107
  "type": "address"
108
108
  },
109
109
  {
110
+ "components": [
111
+ {
112
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
113
+ "name": "deposit",
114
+ "type": "uint8"
115
+ },
116
+ {
117
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
118
+ "name": "withdraw",
119
+ "type": "uint8"
120
+ },
121
+ {
122
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
123
+ "name": "sendTransfer",
124
+ "type": "uint8"
125
+ },
126
+ {
127
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
128
+ "name": "receiveTransfer",
129
+ "type": "uint8"
130
+ }
131
+ ],
110
132
  "indexed": false,
111
- "internalType": "bool",
133
+ "internalType": "struct LPManualWhitelist.WhitelistStatus",
112
134
  "name": "whitelisted",
113
- "type": "bool"
135
+ "type": "tuple"
114
136
  }
115
137
  ],
116
- "name": "LPWhitelisted",
138
+ "name": "LPWhitelistStatusChanged",
117
139
  "type": "event"
118
140
  },
119
141
  {
@@ -207,6 +229,19 @@
207
229
  "stateMutability": "view",
208
230
  "type": "function"
209
231
  },
232
+ {
233
+ "inputs": [],
234
+ "name": "LP_WHITELIST_ADMIN_ROLE",
235
+ "outputs": [
236
+ {
237
+ "internalType": "bytes32",
238
+ "name": "",
239
+ "type": "bytes32"
240
+ }
241
+ ],
242
+ "stateMutability": "view",
243
+ "type": "function"
244
+ },
210
245
  {
211
246
  "inputs": [],
212
247
  "name": "LP_WHITELIST_ROLE",
@@ -271,7 +306,7 @@
271
306
  },
272
307
  {
273
308
  "internalType": "address",
274
- "name": "",
309
+ "name": "providerFrom",
275
310
  "type": "address"
276
311
  },
277
312
  {
@@ -296,6 +331,35 @@
296
331
  "stateMutability": "view",
297
332
  "type": "function"
298
333
  },
334
+ {
335
+ "inputs": [
336
+ {
337
+ "internalType": "contract IEToken",
338
+ "name": "",
339
+ "type": "address"
340
+ },
341
+ {
342
+ "internalType": "address",
343
+ "name": "provider",
344
+ "type": "address"
345
+ },
346
+ {
347
+ "internalType": "uint256",
348
+ "name": "",
349
+ "type": "uint256"
350
+ }
351
+ ],
352
+ "name": "acceptsWithdrawal",
353
+ "outputs": [
354
+ {
355
+ "internalType": "bool",
356
+ "name": "",
357
+ "type": "bool"
358
+ }
359
+ ],
360
+ "stateMutability": "view",
361
+ "type": "function"
362
+ },
299
363
  {
300
364
  "inputs": [],
301
365
  "name": "currency",
@@ -311,6 +375,69 @@
311
375
  },
312
376
  {
313
377
  "inputs": [],
378
+ "name": "getWhitelistDefaults",
379
+ "outputs": [
380
+ {
381
+ "components": [
382
+ {
383
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
384
+ "name": "deposit",
385
+ "type": "uint8"
386
+ },
387
+ {
388
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
389
+ "name": "withdraw",
390
+ "type": "uint8"
391
+ },
392
+ {
393
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
394
+ "name": "sendTransfer",
395
+ "type": "uint8"
396
+ },
397
+ {
398
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
399
+ "name": "receiveTransfer",
400
+ "type": "uint8"
401
+ }
402
+ ],
403
+ "internalType": "struct LPManualWhitelist.WhitelistStatus",
404
+ "name": "",
405
+ "type": "tuple"
406
+ }
407
+ ],
408
+ "stateMutability": "view",
409
+ "type": "function"
410
+ },
411
+ {
412
+ "inputs": [
413
+ {
414
+ "components": [
415
+ {
416
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
417
+ "name": "deposit",
418
+ "type": "uint8"
419
+ },
420
+ {
421
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
422
+ "name": "withdraw",
423
+ "type": "uint8"
424
+ },
425
+ {
426
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
427
+ "name": "sendTransfer",
428
+ "type": "uint8"
429
+ },
430
+ {
431
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
432
+ "name": "receiveTransfer",
433
+ "type": "uint8"
434
+ }
435
+ ],
436
+ "internalType": "struct LPManualWhitelist.WhitelistStatus",
437
+ "name": "defaultStatus",
438
+ "type": "tuple"
439
+ }
440
+ ],
314
441
  "name": "initialize",
315
442
  "outputs": [],
316
443
  "stateMutability": "nonpayable",
@@ -380,6 +507,41 @@
380
507
  "stateMutability": "view",
381
508
  "type": "function"
382
509
  },
510
+ {
511
+ "inputs": [
512
+ {
513
+ "components": [
514
+ {
515
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
516
+ "name": "deposit",
517
+ "type": "uint8"
518
+ },
519
+ {
520
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
521
+ "name": "withdraw",
522
+ "type": "uint8"
523
+ },
524
+ {
525
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
526
+ "name": "sendTransfer",
527
+ "type": "uint8"
528
+ },
529
+ {
530
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
531
+ "name": "receiveTransfer",
532
+ "type": "uint8"
533
+ }
534
+ ],
535
+ "internalType": "struct LPManualWhitelist.WhitelistStatus",
536
+ "name": "newStatus",
537
+ "type": "tuple"
538
+ }
539
+ ],
540
+ "name": "setWhitelistDefaults",
541
+ "outputs": [],
542
+ "stateMutability": "nonpayable",
543
+ "type": "function"
544
+ },
383
545
  {
384
546
  "inputs": [
385
547
  {
@@ -445,9 +607,31 @@
445
607
  "type": "address"
446
608
  },
447
609
  {
448
- "internalType": "bool",
449
- "name": "whitelisted",
450
- "type": "bool"
610
+ "components": [
611
+ {
612
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
613
+ "name": "deposit",
614
+ "type": "uint8"
615
+ },
616
+ {
617
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
618
+ "name": "withdraw",
619
+ "type": "uint8"
620
+ },
621
+ {
622
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
623
+ "name": "sendTransfer",
624
+ "type": "uint8"
625
+ },
626
+ {
627
+ "internalType": "enum LPManualWhitelist.WhitelistOptions",
628
+ "name": "receiveTransfer",
629
+ "type": "uint8"
630
+ }
631
+ ],
632
+ "internalType": "struct LPManualWhitelist.WhitelistStatus",
633
+ "name": "newStatus",
634
+ "type": "tuple"
451
635
  }
452
636
  ],
453
637
  "name": "whitelistAddress",
@@ -456,8 +640,8 @@
456
640
  "type": "function"
457
641
  }
458
642
  ],
459
- "bytecode": "0x60c0604052306080523480156200001557600080fd5b5060405162001acd38038062001acd833981016040819052620000389162000197565b806001600160a01b038116620000bb5760405162461bcd60e51b815260206004820152603660248201527f506f6c696379506f6f6c436f6d706f6e656e743a20706f6c696379506f6f6c2060448201527f63616e6e6f74206265207a65726f20616464726573730000000000000000000060648201526084015b60405180910390fd5b620000c5620000d8565b6001600160a01b031660a05250620001c9565b600054610100900460ff1615620001425760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000b2565b60005460ff908116101562000195576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001aa57600080fd5b81516001600160a01b0381168114620001c257600080fd5b9392505050565b60805160a051611898620002356000396000818161025f015281816105a60152818161094e01528181610a7801528181610c0701528181610cf4015261102e015260008181610472015281816104bb015281816106b8015281816106f8015261078701526118986000f3fe60806040526004361061011f5760003560e01c80635b494dd5116100a05780638456cb59116100645780638456cb591461038a578063aad4148c1461039f578063b9a45aac146103d3578063e5a6b10f146103f3578063f67b2bad1461040857600080fd5b80635b494dd5146102bf5780635c975abb146102f35780635fcdca371461030b5780637ed5acfa146103485780638129fc1c1461037557600080fd5b8063468a8c9f116100e7578063468a8c9f146101e05780634a47a3e01461021c5780634d15eb03146102505780634f1ef2861461029757806352d1902d146102aa57600080fd5b806301ffc9a71461012457806324ea54f4146101595780633659cfe61461018957806337ee20dd146101ab5780633f4ba83a146101cb575b600080fd5b34801561013057600080fd5b5061014461013f366004611469565b61043c565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017b60008051602061184383398151915281565b604051908152602001610150565b34801561019557600080fd5b506101a96101a43660046114a8565b610468565b005b3480156101b757600080fd5b506101446101c63660046114c5565b610550565b3480156101d757600080fd5b506101a9610574565b3480156101ec57600080fd5b5060c9546040805164ffffffffff831681526501000000000090920466ffffffffffffff16602083015201610150565b34801561022857600080fd5b5061017b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b34801561025c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610150565b6101a96102a536600461151c565b6106ae565b3480156102b657600080fd5b5061017b61077a565b3480156102cb57600080fd5b5061017b7f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156102ff57600080fd5b5060975460ff16610144565b34801561031757600080fd5b506101446103263660046115e0565b506001600160a01b0316600090815260fb602052604090205460ff1692915050565b34801561035457600080fd5b5061035f6201518081565b60405164ffffffffff9091168152602001610150565b34801561038157600080fd5b506101a961082d565b34801561039657600080fd5b506101a961093d565b3480156103ab57600080fd5b5061017b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f323581565b3480156103df57600080fd5b506101a96103ee366004611631565b610a55565b3480156103ff57600080fd5b5061027f610c03565b34801561041457600080fd5b5061017b7fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb281565b600061044782610c8c565b8061046257506001600160e01b03198216633411f57560e11b145b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104b95760405162461bcd60e51b81526004016104b09061166f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166105026000805160206117fc833981519152546001600160a01b031690565b6001600160a01b0316146105285760405162461bcd60e51b81526004016104b0906116bb565b61053181610cc2565b6040805160008082526020820190925261054d91839190610df9565b50565b6001600160a01b038216600090815260fb602052604090205460ff165b9392505050565b6000805160206118438339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190611707565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561068a57600080fd5b505afa15801561069e573d6000803e3d6000fd5b505050506106aa610f64565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106f65760405162461bcd60e51b81526004016104b09061166f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661073f6000805160206117fc833981519152546001600160a01b031690565b6001600160a01b0316146107655760405162461bcd60e51b81526004016104b0906116bb565b61076e82610cc2565b6106aa82826001610df9565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461081a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104b0565b506000805160206117fc83398151915290565b600054610100900460ff161580801561084d5750600054600160ff909116105b806108675750303b158015610867575060005460ff166001145b6108ca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104b0565b6000805460ff1916600117905580156108ed576000805461ff0019166101001790555b6108f5610fb6565b801561054d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000805160206118438339815191527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611707565b6001600160a01b0316635ff57d2030833360405160e085901b6001600160e01b03191681526001600160a01b039384166004820152602481019290925290911660448201526001606482015260840160006040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b5050505061054d610fef565b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f32357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af89190611707565b6001600160a01b0316635ff57d2030833360405160e085901b6001600160e01b03191681526001600160a01b039384166004820152602481019290925290911660448201526000606482015260840160006040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b5050506001600160a01b038416600090815260fb602052604090205460ff161515831515149050610bfe576001600160a01b038316600081815260fb6020908152604091829020805460ff19168615159081179091558251938452908301527f8ef34cf5cfaa6ce2f80f1ba2912749c912a8b07c4fb8e9949e928e7cb592918f910160405180910390a15b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190611707565b905090565b60006001600160e01b031982166301ffc9a760e01b148061046257506001600160e01b03198216634d15eb0360e01b1492915050565b6000805160206118438339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190611707565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b158015610dd857600080fd5b505afa158015610dec573d6000803e3d6000fd5b50505050610bfe8361102c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610e2c57610bfe8361111d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e86575060408051601f3d908101601f19168201909252610e8391810190611724565b60015b610ee95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104b0565b6000805160206117fc8339815191528114610f585760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104b0565b50610bfe8383836111b9565b610f6c6111e4565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff16610fdd5760405162461bcd60e51b81526004016104b09061173d565b610fe561122d565b610fed611254565b565b610ff7611283565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f993390565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b89190611707565b6001600160a01b03161461054d5760405162461bcd60e51b815260206004820152602660248201527f43616e27742075706772616465206368616e67696e672074686520506f6c696360448201526579506f6f6c2160d01b60648201526084016104b0565b6001600160a01b0381163b61118a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104b0565b6000805160206117fc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6111c2836112c9565b6000825111806111cf5750805b15610bfe576111de8383611309565b50505050565b60975460ff16610fed5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016104b0565b600054610100900460ff16610fed5760405162461bcd60e51b81526004016104b09061173d565b600054610100900460ff1661127b5760405162461bcd60e51b81526004016104b09061173d565b610fed6113fd565b60975460ff1615610fed5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016104b0565b6112d28161111d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6113715760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104b0565b600080846001600160a01b03168460405161138c91906117ac565b600060405180830381855af49150503d80600081146113c7576040519150601f19603f3d011682016040523d82523d6000602084013e6113cc565b606091505b50915091506113f4828260405180606001604052806027815260200161181c60279139611430565b95945050505050565b600054610100900460ff166114245760405162461bcd60e51b81526004016104b09061173d565b6097805460ff19169055565b6060831561143f57508161056d565b82511561144f5782518084602001fd5b8160405162461bcd60e51b81526004016104b091906117c8565b60006020828403121561147b57600080fd5b81356001600160e01b03198116811461056d57600080fd5b6001600160a01b038116811461054d57600080fd5b6000602082840312156114ba57600080fd5b813561056d81611493565b6000806000606084860312156114da57600080fd5b83356114e581611493565b925060208401356114f581611493565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561152f57600080fd5b823561153a81611493565b9150602083013567ffffffffffffffff8082111561155757600080fd5b818501915085601f83011261156b57600080fd5b81358181111561157d5761157d611506565b604051601f8201601f19908116603f011681019083821181831017156115a5576115a5611506565b816040528281528860208487010111156115be57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600080608085870312156115f657600080fd5b843561160181611493565b9350602085013561161181611493565b9250604085013561162181611493565b9396929550929360600135925050565b6000806040838503121561164457600080fd5b823561164f81611493565b91506020830135801515811461166457600080fd5b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561171957600080fd5b815161056d81611493565b60006020828403121561173657600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156117a357818101518382015260200161178b565b50506000910152565b600082516117be818460208701611788565b9190910192915050565b60208152600082518060208401526117e7816040850160208701611788565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f7ed9332d11c18419a12719d24f2df48604b013f26abc7013c359a104deab22764736f6c63430008100033",
460
- "deployedBytecode": "0x60806040526004361061011f5760003560e01c80635b494dd5116100a05780638456cb59116100645780638456cb591461038a578063aad4148c1461039f578063b9a45aac146103d3578063e5a6b10f146103f3578063f67b2bad1461040857600080fd5b80635b494dd5146102bf5780635c975abb146102f35780635fcdca371461030b5780637ed5acfa146103485780638129fc1c1461037557600080fd5b8063468a8c9f116100e7578063468a8c9f146101e05780634a47a3e01461021c5780634d15eb03146102505780634f1ef2861461029757806352d1902d146102aa57600080fd5b806301ffc9a71461012457806324ea54f4146101595780633659cfe61461018957806337ee20dd146101ab5780633f4ba83a146101cb575b600080fd5b34801561013057600080fd5b5061014461013f366004611469565b61043c565b60405190151581526020015b60405180910390f35b34801561016557600080fd5b5061017b60008051602061184383398151915281565b604051908152602001610150565b34801561019557600080fd5b506101a96101a43660046114a8565b610468565b005b3480156101b757600080fd5b506101446101c63660046114c5565b610550565b3480156101d757600080fd5b506101a9610574565b3480156101ec57600080fd5b5060c9546040805164ffffffffff831681526501000000000090920466ffffffffffffff16602083015201610150565b34801561022857600080fd5b5061017b7fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b34801561025c57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610150565b6101a96102a536600461151c565b6106ae565b3480156102b657600080fd5b5061017b61077a565b3480156102cb57600080fd5b5061017b7f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b3480156102ff57600080fd5b5060975460ff16610144565b34801561031757600080fd5b506101446103263660046115e0565b506001600160a01b0316600090815260fb602052604090205460ff1692915050565b34801561035457600080fd5b5061035f6201518081565b60405164ffffffffff9091168152602001610150565b34801561038157600080fd5b506101a961082d565b34801561039657600080fd5b506101a961093d565b3480156103ab57600080fd5b5061017b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f323581565b3480156103df57600080fd5b506101a96103ee366004611631565b610a55565b3480156103ff57600080fd5b5061027f610c03565b34801561041457600080fd5b5061017b7fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb281565b600061044782610c8c565b8061046257506001600160e01b03198216633411f57560e11b145b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036104b95760405162461bcd60e51b81526004016104b09061166f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166105026000805160206117fc833981519152546001600160a01b031690565b6001600160a01b0316146105285760405162461bcd60e51b81526004016104b0906116bb565b61053181610cc2565b6040805160008082526020820190925261054d91839190610df9565b50565b6001600160a01b038216600090815260fb602052604090205460ff165b9392505050565b6000805160206118438339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190611707565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561068a57600080fd5b505afa15801561069e573d6000803e3d6000fd5b505050506106aa610f64565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106f65760405162461bcd60e51b81526004016104b09061166f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661073f6000805160206117fc833981519152546001600160a01b031690565b6001600160a01b0316146107655760405162461bcd60e51b81526004016104b0906116bb565b61076e82610cc2565b6106aa82826001610df9565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461081a5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104b0565b506000805160206117fc83398151915290565b600054610100900460ff161580801561084d5750600054600160ff909116105b806108675750303b158015610867575060005460ff166001145b6108ca5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104b0565b6000805460ff1916600117905580156108ed576000805461ff0019166101001790555b6108f5610fb6565b801561054d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b6000805160206118438339815191527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ce9190611707565b6001600160a01b0316635ff57d2030833360405160e085901b6001600160e01b03191681526001600160a01b039384166004820152602481019290925290911660448201526001606482015260840160006040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b5050505061054d610fef565b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f32357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af89190611707565b6001600160a01b0316635ff57d2030833360405160e085901b6001600160e01b03191681526001600160a01b039384166004820152602481019290925290911660448201526000606482015260840160006040518083038186803b158015610b5f57600080fd5b505afa158015610b73573d6000803e3d6000fd5b5050506001600160a01b038416600090815260fb602052604090205460ff161515831515149050610bfe576001600160a01b038316600081815260fb6020908152604091829020805460ff19168615159081179091558251938452908301527f8ef34cf5cfaa6ce2f80f1ba2912749c912a8b07c4fb8e9949e928e7cb592918f910160405180910390a15b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190611707565b905090565b60006001600160e01b031982166301ffc9a760e01b148061046257506001600160e01b03198216634d15eb0360e01b1492915050565b6000805160206118438339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190611707565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b158015610dd857600080fd5b505afa158015610dec573d6000803e3d6000fd5b50505050610bfe8361102c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610e2c57610bfe8361111d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610e86575060408051601f3d908101601f19168201909252610e8391810190611724565b60015b610ee95760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104b0565b6000805160206117fc8339815191528114610f585760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104b0565b50610bfe8383836111b9565b610f6c6111e4565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff16610fdd5760405162461bcd60e51b81526004016104b09061173d565b610fe561122d565b610fed611254565b565b610ff7611283565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610f993390565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa158015611094573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b89190611707565b6001600160a01b03161461054d5760405162461bcd60e51b815260206004820152602660248201527f43616e27742075706772616465206368616e67696e672074686520506f6c696360448201526579506f6f6c2160d01b60648201526084016104b0565b6001600160a01b0381163b61118a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104b0565b6000805160206117fc83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6111c2836112c9565b6000825111806111cf5750805b15610bfe576111de8383611309565b50505050565b60975460ff16610fed5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016104b0565b600054610100900460ff16610fed5760405162461bcd60e51b81526004016104b09061173d565b600054610100900460ff1661127b5760405162461bcd60e51b81526004016104b09061173d565b610fed6113fd565b60975460ff1615610fed5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016104b0565b6112d28161111d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6113715760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104b0565b600080846001600160a01b03168460405161138c91906117ac565b600060405180830381855af49150503d80600081146113c7576040519150601f19603f3d011682016040523d82523d6000602084013e6113cc565b606091505b50915091506113f4828260405180606001604052806027815260200161181c60279139611430565b95945050505050565b600054610100900460ff166114245760405162461bcd60e51b81526004016104b09061173d565b6097805460ff19169055565b6060831561143f57508161056d565b82511561144f5782518084602001fd5b8160405162461bcd60e51b81526004016104b091906117c8565b60006020828403121561147b57600080fd5b81356001600160e01b03198116811461056d57600080fd5b6001600160a01b038116811461054d57600080fd5b6000602082840312156114ba57600080fd5b813561056d81611493565b6000806000606084860312156114da57600080fd5b83356114e581611493565b925060208401356114f581611493565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561152f57600080fd5b823561153a81611493565b9150602083013567ffffffffffffffff8082111561155757600080fd5b818501915085601f83011261156b57600080fd5b81358181111561157d5761157d611506565b604051601f8201601f19908116603f011681019083821181831017156115a5576115a5611506565b816040528281528860208487010111156115be57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600080608085870312156115f657600080fd5b843561160181611493565b9350602085013561161181611493565b9250604085013561162181611493565b9396929550929360600135925050565b6000806040838503121561164457600080fd5b823561164f81611493565b91506020830135801515811461166457600080fd5b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60006020828403121561171957600080fd5b815161056d81611493565b60006020828403121561173657600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b838110156117a357818101518382015260200161178b565b50506000910152565b600082516117be818460208701611788565b9190910192915050565b60208152600082518060208401526117e7816040850160208701611788565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a2646970667358221220f7ed9332d11c18419a12719d24f2df48604b013f26abc7013c359a104deab22764736f6c63430008100033",
643
+ "bytecode": "0x60c0604052306080523480156200001557600080fd5b506040516200258938038062002589833981016040819052620000389162000197565b806001600160a01b038116620000bb5760405162461bcd60e51b815260206004820152603660248201527f506f6c696379506f6f6c436f6d706f6e656e743a20706f6c696379506f6f6c2060448201527f63616e6e6f74206265207a65726f20616464726573730000000000000000000060648201526084015b60405180910390fd5b620000c5620000d8565b6001600160a01b031660a05250620001c9565b600054610100900460ff1615620001425760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000b2565b60005460ff908116101562000195576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001aa57600080fd5b81516001600160a01b0381168114620001c257600080fd5b9392505050565b60805160a05161234d6200023c600039600081816102bf015281816106a501528181610a4001528181610b4d01528181610e3b01528181610f3e01528181611149015261168e0152600081816105220152818161056b015281816107b7015281816107f70152610886015261234d6000f3fe60806040526004361061014b5760003560e01c80635c975abb116100b6578063aa2f92fb1161006f578063aa2f92fb1461040d578063aad4148c1461042d578063cf273ca614610461578063e5a6b10f14610481578063ed716bf414610496578063f67b2bad146104b857600080fd5b80635c975abb146103535780635fcdca371461036b5780637ed5acfa1461038b5780638456cb59146103b8578063896ce44c146103cd5780639051c763146103ed57600080fd5b8063468a8c9f11610108578063468a8c9f146102405780634a47a3e01461027c5780634d15eb03146102b05780634f1ef286146102f757806352d1902d1461030a5780635b494dd51461031f57600080fd5b806301ffc9a7146101505780631e3b9c5e1461018557806324ea54f4146101c75780633659cfe6146101e957806337ee20dd1461020b5780633f4ba83a1461022b575b600080fd5b34801561015c57600080fd5b5061017061016b366004611b95565b6104ec565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b506101b97f88aab6b3a9fda9055d4a72094d587b65c9aadcc55fb1631e646a2f2c284ced5b81565b60405190815260200161017c565b3480156101d357600080fd5b506101b96000805160206122f883398151915281565b3480156101f557600080fd5b50610209610204366004611bd4565b610518565b005b34801561021757600080fd5b50610170610226366004611bf1565b610600565b34801561023757600080fd5b50610209610673565b34801561024c57600080fd5b5060c9546040805164ffffffffff831681526501000000000090920466ffffffffffffff1660208301520161017c565b34801561028857600080fd5b506101b97fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b3480156102bc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161017c565b610209610305366004611c79565b6107ad565b34801561031657600080fd5b506101b9610879565b34801561032b57600080fd5b506101b97f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b34801561035f57600080fd5b5060975460ff16610170565b34801561037757600080fd5b50610170610386366004611d21565b61092c565b34801561039757600080fd5b506103a26201518081565b60405164ffffffffff909116815260200161017c565b3480156103c457600080fd5b50610209610a2f565b3480156103d957600080fd5b506102096103e8366004611d8a565b610b2a565b3480156103f957600080fd5b50610170610408366004611bf1565b610ca3565b34801561041957600080fd5b50610209610428366004611dc0565b610d05565b34801561043957600080fd5b506101b97fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f323581565b34801561046d57600080fd5b5061020961047c366004611dc0565b610e18565b34801561048d57600080fd5b506102df610f3a565b3480156104a257600080fd5b506104ab610fc3565b60405161017c9190611e57565b3480156104c457600080fd5b506101b97fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb281565b60006104f7826110e1565b8061051257506001600160e01b0319821663f8722d8960e01b145b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036105695760405162461bcd60e51b815260040161056090611e65565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166105b26000805160206122b1833981519152546001600160a01b031690565b6001600160a01b0316146105d85760405162461bcd60e51b815260040161056090611eb1565b6105e181611117565b604080516000808252602082019092526105fd9183919061124e565b50565b6001600160a01b038216600090815260fb602052604081205460ff168181600281111561062f5761062f611ddc565b0361065257506000805260fb6020526000805160206122918339815191525460ff165b60015b81600281111561066757610667611ddc565b149150505b9392505050565b6000805160206122f88339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190611efd565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561078957600080fd5b505afa15801561079d573d6000803e3d6000fd5b505050506107a96113b9565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107f55760405162461bcd60e51b815260040161056090611e65565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661083e6000805160206122b1833981519152546001600160a01b031690565b6001600160a01b0316146108645760405162461bcd60e51b815260040161056090611eb1565b61086d82611117565b6107a98282600161124e565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109195760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610560565b506000805160206122b183398151915290565b6001600160a01b038316600090815260fb602052604081205462010000900460ff168181600281111561096157610961611ddc565b0361098a57506000805260fb6020526000805160206122918339815191525462010000900460ff165b600181600281111561099e5761099e611ddc565b146109ad576000915050610a27565b506001600160a01b038316600090815260fb60205260408120546301000000900460ff16908160028111156109e4576109e4611ddc565b03610a0e57506000805260fb602052600080516020612291833981519152546301000000900460ff165b6001816002811115610a2257610a22611ddc565b149150505b949350505050565b6000805160206122f88339815191527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac09190611efd565b6001600160a01b0316635ff57d2030833360016040518563ffffffff1660e01b8152600401610af29493929190611f1a565b60006040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506105fd61140b565b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f32357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190611efd565b6001600160a01b0316635ff57d2030833360006040518563ffffffff1660e01b8152600401610bff9493929190611f1a565b60006040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b5050506001600160a01b0384169050610c865760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e2774206368616e6765207468652064656661756c74730000006044820152606401610560565b610c9e83610c9936859003850185611f51565b611448565b505050565b6001600160a01b038216600090815260fb6020526040812054610100900460ff1681816002811115610cd757610cd7611ddc565b0361065257506000805260fb60205260008051602061229183398151915254610100900460ff166001610655565b600054610100900460ff1615808015610d255750600054600160ff909116105b80610d3f5750303b158015610d3f575060005460ff166001145b610da25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610560565b6000805460ff191660011790558015610dc5576000805461ff0019166101001790555b610dce82611539565b80156107a9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f88aab6b3a9fda9055d4a72094d587b65c9aadcc55fb1631e646a2f2c284ced5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190611efd565b6001600160a01b0316635ff57d2030833360006040518563ffffffff1660e01b8152600401610eed9493929190611f1a565b60006040518083038186803b158015610f0557600080fd5b505afa158015610f19573d6000803e3d6000fd5b50505050610f2682611571565b6107a96000610c9936859003850185611f51565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190611efd565b905090565b610fee6040805160808101909152806000815260200160008152602001600081526020016000905290565b6000805260fb60205260408051608081019091526000805160206122918339815191528054829060ff16600281111561102957611029611ddc565b600281111561103a5761103a611ddc565b81528154602090910190610100900460ff16600281111561105d5761105d611ddc565b600281111561106e5761106e611ddc565b8152815460209091019062010000900460ff16600281111561109257611092611ddc565b60028111156110a3576110a3611ddc565b815281546020909101906301000000900460ff1660028111156110c8576110c8611ddc565b60028111156110d9576110d9611ddc565b905250919050565b60006001600160e01b031982166301ffc9a760e01b148061051257506001600160e01b03198216634d15eb0360e01b1492915050565b6000805160206122f88339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c99190611efd565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b50505050610c9e8361168c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561128157610c9e8361177d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112db575060408051601f3d908101601f191682019092526112d891810190611fd6565b60015b61133e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610560565b6000805160206122b183398151915281146113ad5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610560565b50610c9e838383611819565b6113c1611844565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61141361188f565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113ee3390565b6001600160a01b038216600090815260fb602052604090208151815483929190829060ff1916600183600281111561148257611482611ddc565b021790555060208201518154829061ff0019166101008360028111156114aa576114aa611ddc565b021790555060408201518154829062ff00001916620100008360028111156114d4576114d4611ddc565b021790555060608201518154829063ff0000001916630100000083600281111561150057611500611ddc565b02179055509050507f95d7a6740c7954755644347f27cbf1bebf7d02a83371922a49d04ddce4757c2a8282604051610e0c929190611fef565b600054610100900460ff166115605760405162461bcd60e51b81526004016105609061200c565b6115686118d5565b6105fd8161190c565b60006115806020830183612057565b600281111561159157611591611ddc565b141580156115c0575060006115ac6040830160208401612057565b60028111156115bd576115bd611ddc565b14155b80156115ed575060006115d96060830160408401612057565b60028111156115ea576115ea611ddc565b14155b801561161a575060006116066080830160608401612057565b600281111561161757611617611ddc565b14155b6105fd5760405162461bcd60e51b815260206004820152603c60248201527f596f75206e65656420746f20646566696e65207468652064656661756c74207360448201527f746174757320666f7220616c6c20746865206f7065726174696f6e73000000006064820152608401610560565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190611efd565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152602660248201527f43616e27742075706772616465206368616e67696e672074686520506f6c696360448201526579506f6f6c2160d01b6064820152608401610560565b6001600160a01b0381163b6117ea5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610560565b6000805160206122b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6118228361199f565b60008251118061182f5750805b15610c9e5761183e83836119df565b50505050565b60975460ff1661188d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610560565b565b60975460ff161561188d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610560565b600054610100900460ff166118fc5760405162461bcd60e51b81526004016105609061200c565b611904611ad3565b61188d611afa565b600054610100900460ff166119335760405162461bcd60e51b81526004016105609061200c565b61193c81611571565b6000805260fb6020528060008051602061229183398151915261195f82826120f3565b9050507f95d7a6740c7954755644347f27cbf1bebf7d02a83371922a49d04ddce4757c2a600082604051611994929190612199565b60405180910390a150565b6119a88161177d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b611a475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610560565b600080846001600160a01b031684604051611a629190612241565b600060405180830381855af49150503d8060008114611a9d576040519150601f19603f3d011682016040523d82523d6000602084013e611aa2565b606091505b5091509150611aca82826040518060600160405280602781526020016122d160279139611b29565b95945050505050565b600054610100900460ff1661188d5760405162461bcd60e51b81526004016105609061200c565b600054610100900460ff16611b215760405162461bcd60e51b81526004016105609061200c565b61188d611b62565b60608315611b3857508161066c565b825115611b485782518084602001fd5b8160405162461bcd60e51b8152600401610560919061225d565b600054610100900460ff16611b895760405162461bcd60e51b81526004016105609061200c565b6097805460ff19169055565b600060208284031215611ba757600080fd5b81356001600160e01b03198116811461066c57600080fd5b6001600160a01b03811681146105fd57600080fd5b600060208284031215611be657600080fd5b813561066c81611bbf565b600080600060608486031215611c0657600080fd5b8335611c1181611bbf565b92506020840135611c2181611bbf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c7157611c71611c32565b604052919050565b60008060408385031215611c8c57600080fd5b8235611c9781611bbf565b915060208381013567ffffffffffffffff80821115611cb557600080fd5b818601915086601f830112611cc957600080fd5b813581811115611cdb57611cdb611c32565b611ced601f8201601f19168501611c48565b91508082528784828501011115611d0357600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060008060808587031215611d3757600080fd5b8435611d4281611bbf565b93506020850135611d5281611bbf565b92506040850135611d6281611bbf565b9396929550929360600135925050565b600060808284031215611d8457600080fd5b50919050565b60008060a08385031215611d9d57600080fd5b8235611da881611bbf565b9150611db78460208501611d72565b90509250929050565b600060808284031215611dd257600080fd5b61066c8383611d72565b634e487b7160e01b600052602160045260246000fd5b60038110611e1057634e487b7160e01b600052602160045260246000fd5b9052565b611e1f828251611df2565b6020810151611e316020840182611df2565b506040810151611e446040840182611df2565b506060810151610c9e6060840182611df2565b608081016105128284611e14565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215611f0f57600080fd5b815161066c81611bbf565b6001600160a01b039485168152602081019390935292166040820152901515606082015260800190565b600381106105fd57600080fd5b600060808284031215611f6357600080fd5b6040516080810181811067ffffffffffffffff82111715611f8657611f86611c32565b6040528235611f9481611f44565b81526020830135611fa481611f44565b60208201526040830135611fb781611f44565b60408201526060830135611fca81611f44565b60608201529392505050565b600060208284031215611fe857600080fd5b5051919050565b6001600160a01b038316815260a0810161066c6020830184611e14565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561206957600080fd5b813561066c81611f44565b6000813561051281611f44565b6003821061209f57634e487b7160e01b600052602160045260246000fd5b805462ff00008360101b1662ff0000198216178255505050565b600382106120d757634e487b7160e01b600052602160045260246000fd5b805463ff0000008360181b1663ff000000198216178255505050565b81356120fe81611f44565b6003811061211c57634e487b7160e01b600052602160045260246000fd5b815460ff821691508160ff198216178355602084013561213b81611f44565b6003811061215957634e487b7160e01b600052602160045260246000fd5b61ff008160081b168361ffff1984161717845550505061218461217e60408401612074565b82612081565b6107a961219360608401612074565b826120b9565b6001600160a01b038316815260a0810182356121b481611f44565b6121c16020840182611df2565b5060208301356121d081611f44565b6121dd6040840182611df2565b5060408301356121ec81611f44565b6121f96060840182611df2565b50606083013561220881611f44565b6122156080840182611df2565b509392505050565b60005b83811015612238578181015183820152602001612220565b50506000910152565b6000825161225381846020870161221d565b9190910192915050565b602081526000825180602084015261227c81604085016020870161221d565b601f01601f1916919091016040019291505056fec88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d8975360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a26469706673582212209d8e7e225e8fda000c166f5f0311960220729ec38657290252ef8ccd38865ad764736f6c63430008100033",
644
+ "deployedBytecode": "0x60806040526004361061014b5760003560e01c80635c975abb116100b6578063aa2f92fb1161006f578063aa2f92fb1461040d578063aad4148c1461042d578063cf273ca614610461578063e5a6b10f14610481578063ed716bf414610496578063f67b2bad146104b857600080fd5b80635c975abb146103535780635fcdca371461036b5780637ed5acfa1461038b5780638456cb59146103b8578063896ce44c146103cd5780639051c763146103ed57600080fd5b8063468a8c9f11610108578063468a8c9f146102405780634a47a3e01461027c5780634d15eb03146102b05780634f1ef286146102f757806352d1902d1461030a5780635b494dd51461031f57600080fd5b806301ffc9a7146101505780631e3b9c5e1461018557806324ea54f4146101c75780633659cfe6146101e957806337ee20dd1461020b5780633f4ba83a1461022b575b600080fd5b34801561015c57600080fd5b5061017061016b366004611b95565b6104ec565b60405190151581526020015b60405180910390f35b34801561019157600080fd5b506101b97f88aab6b3a9fda9055d4a72094d587b65c9aadcc55fb1631e646a2f2c284ced5b81565b60405190815260200161017c565b3480156101d357600080fd5b506101b96000805160206122f883398151915281565b3480156101f557600080fd5b50610209610204366004611bd4565b610518565b005b34801561021757600080fd5b50610170610226366004611bf1565b610600565b34801561023757600080fd5b50610209610673565b34801561024c57600080fd5b5060c9546040805164ffffffffff831681526501000000000090920466ffffffffffffff1660208301520161017c565b34801561028857600080fd5b506101b97fa82e22387fca439f316d78ca566f383218ab8ae1b3e830178c9c82cbd16749c081565b3480156102bc57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161017c565b610209610305366004611c79565b6107ad565b34801561031657600080fd5b506101b9610879565b34801561032b57600080fd5b506101b97f5ec196419322369c6bac572d883f4d990ae5ec82f7d93cdf89b85dbb05b63c2781565b34801561035f57600080fd5b5060975460ff16610170565b34801561037757600080fd5b50610170610386366004611d21565b61092c565b34801561039757600080fd5b506103a26201518081565b60405164ffffffffff909116815260200161017c565b3480156103c457600080fd5b50610209610a2f565b3480156103d957600080fd5b506102096103e8366004611d8a565b610b2a565b3480156103f957600080fd5b50610170610408366004611bf1565b610ca3565b34801561041957600080fd5b50610209610428366004611dc0565b610d05565b34801561043957600080fd5b506101b97fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f323581565b34801561046d57600080fd5b5061020961047c366004611dc0565b610e18565b34801561048d57600080fd5b506102df610f3a565b3480156104a257600080fd5b506104ab610fc3565b60405161017c9190611e57565b3480156104c457600080fd5b506101b97fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb281565b60006104f7826110e1565b8061051257506001600160e01b0319821663f8722d8960e01b145b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036105695760405162461bcd60e51b815260040161056090611e65565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166105b26000805160206122b1833981519152546001600160a01b031690565b6001600160a01b0316146105d85760405162461bcd60e51b815260040161056090611eb1565b6105e181611117565b604080516000808252602082019092526105fd9183919061124e565b50565b6001600160a01b038216600090815260fb602052604081205460ff168181600281111561062f5761062f611ddc565b0361065257506000805260fb6020526000805160206122918339815191525460ff165b60015b81600281111561066757610667611ddc565b149150505b9392505050565b6000805160206122f88339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610701573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107259190611efd565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561078957600080fd5b505afa15801561079d573d6000803e3d6000fd5b505050506107a96113b9565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107f55760405162461bcd60e51b815260040161056090611e65565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661083e6000805160206122b1833981519152546001600160a01b031690565b6001600160a01b0316146108645760405162461bcd60e51b815260040161056090611eb1565b61086d82611117565b6107a98282600161124e565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109195760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610560565b506000805160206122b183398151915290565b6001600160a01b038316600090815260fb602052604081205462010000900460ff168181600281111561096157610961611ddc565b0361098a57506000805260fb6020526000805160206122918339815191525462010000900460ff165b600181600281111561099e5761099e611ddc565b146109ad576000915050610a27565b506001600160a01b038316600090815260fb60205260408120546301000000900460ff16908160028111156109e4576109e4611ddc565b03610a0e57506000805260fb602052600080516020612291833981519152546301000000900460ff165b6001816002811115610a2257610a22611ddc565b149150505b949350505050565b6000805160206122f88339815191527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac09190611efd565b6001600160a01b0316635ff57d2030833360016040518563ffffffff1660e01b8152600401610af29493929190611f1a565b60006040518083038186803b158015610b0a57600080fd5b505afa158015610b1e573d6000803e3d6000fd5b505050506105fd61140b565b7fb494869573b0a0ce9caac5394e1d0d255d146ec7e2d30d643a4e1d78980f32357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190611efd565b6001600160a01b0316635ff57d2030833360006040518563ffffffff1660e01b8152600401610bff9493929190611f1a565b60006040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b5050506001600160a01b0384169050610c865760405162461bcd60e51b815260206004820152601d60248201527f596f752063616e2774206368616e6765207468652064656661756c74730000006044820152606401610560565b610c9e83610c9936859003850185611f51565b611448565b505050565b6001600160a01b038216600090815260fb6020526040812054610100900460ff1681816002811115610cd757610cd7611ddc565b0361065257506000805260fb60205260008051602061229183398151915254610100900460ff166001610655565b600054610100900460ff1615808015610d255750600054600160ff909116105b80610d3f5750303b158015610d3f575060005460ff166001145b610da25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610560565b6000805460ff191660011790558015610dc5576000805461ff0019166101001790555b610dce82611539565b80156107a9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b7f88aab6b3a9fda9055d4a72094d587b65c9aadcc55fb1631e646a2f2c284ced5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebb9190611efd565b6001600160a01b0316635ff57d2030833360006040518563ffffffff1660e01b8152600401610eed9493929190611f1a565b60006040518083038186803b158015610f0557600080fd5b505afa158015610f19573d6000803e3d6000fd5b50505050610f2682611571565b6107a96000610c9936859003850185611f51565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbe9190611efd565b905090565b610fee6040805160808101909152806000815260200160008152602001600081526020016000905290565b6000805260fb60205260408051608081019091526000805160206122918339815191528054829060ff16600281111561102957611029611ddc565b600281111561103a5761103a611ddc565b81528154602090910190610100900460ff16600281111561105d5761105d611ddc565b600281111561106e5761106e611ddc565b8152815460209091019062010000900460ff16600281111561109257611092611ddc565b60028111156110a3576110a3611ddc565b815281546020909101906301000000900460ff1660028111156110c8576110c8611ddc565b60028111156110d9576110d9611ddc565b905250919050565b60006001600160e01b031982166301ffc9a760e01b148061051257506001600160e01b03198216634d15eb0360e01b1492915050565b6000805160206122f88339815191527fbf372ca3ebecfe59ac256f17697941bbe63302aced610e8b0e3646f743c7beb27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166371907f176040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c99190611efd565b60408051632b1cff1f60e01b815230600482015260248101859052604481018490523360648201526001608482015290516001600160a01b039290921691632b1cff1f9160a480820192600092909190829003018186803b15801561122d57600080fd5b505afa158015611241573d6000803e3d6000fd5b50505050610c9e8361168c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561128157610c9e8361177d565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112db575060408051601f3d908101601f191682019092526112d891810190611fd6565b60015b61133e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610560565b6000805160206122b183398151915281146113ad5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610560565b50610c9e838383611819565b6113c1611844565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61141361188f565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586113ee3390565b6001600160a01b038216600090815260fb602052604090208151815483929190829060ff1916600183600281111561148257611482611ddc565b021790555060208201518154829061ff0019166101008360028111156114aa576114aa611ddc565b021790555060408201518154829062ff00001916620100008360028111156114d4576114d4611ddc565b021790555060608201518154829063ff0000001916630100000083600281111561150057611500611ddc565b02179055509050507f95d7a6740c7954755644347f27cbf1bebf7d02a83371922a49d04ddce4757c2a8282604051610e0c929190611fef565b600054610100900460ff166115605760405162461bcd60e51b81526004016105609061200c565b6115686118d5565b6105fd8161190c565b60006115806020830183612057565b600281111561159157611591611ddc565b141580156115c0575060006115ac6040830160208401612057565b60028111156115bd576115bd611ddc565b14155b80156115ed575060006115d96060830160408401612057565b60028111156115ea576115ea611ddc565b14155b801561161a575060006116066080830160608401612057565b600281111561161757611617611ddc565b14155b6105fd5760405162461bcd60e51b815260206004820152603c60248201527f596f75206e65656420746f20646566696e65207468652064656661756c74207360448201527f746174757320666f7220616c6c20746865206f7065726174696f6e73000000006064820152608401610560565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190611efd565b6001600160a01b0316146105fd5760405162461bcd60e51b815260206004820152602660248201527f43616e27742075706772616465206368616e67696e672074686520506f6c696360448201526579506f6f6c2160d01b6064820152608401610560565b6001600160a01b0381163b6117ea5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610560565b6000805160206122b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6118228361199f565b60008251118061182f5750805b15610c9e5761183e83836119df565b50505050565b60975460ff1661188d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610560565b565b60975460ff161561188d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610560565b600054610100900460ff166118fc5760405162461bcd60e51b81526004016105609061200c565b611904611ad3565b61188d611afa565b600054610100900460ff166119335760405162461bcd60e51b81526004016105609061200c565b61193c81611571565b6000805260fb6020528060008051602061229183398151915261195f82826120f3565b9050507f95d7a6740c7954755644347f27cbf1bebf7d02a83371922a49d04ddce4757c2a600082604051611994929190612199565b60405180910390a150565b6119a88161177d565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b611a475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610560565b600080846001600160a01b031684604051611a629190612241565b600060405180830381855af49150503d8060008114611a9d576040519150601f19603f3d011682016040523d82523d6000602084013e611aa2565b606091505b5091509150611aca82826040518060600160405280602781526020016122d160279139611b29565b95945050505050565b600054610100900460ff1661188d5760405162461bcd60e51b81526004016105609061200c565b600054610100900460ff16611b215760405162461bcd60e51b81526004016105609061200c565b61188d611b62565b60608315611b3857508161066c565b825115611b485782518084602001fd5b8160405162461bcd60e51b8152600401610560919061225d565b600054610100900460ff16611b895760405162461bcd60e51b81526004016105609061200c565b6097805460ff19169055565b600060208284031215611ba757600080fd5b81356001600160e01b03198116811461066c57600080fd5b6001600160a01b03811681146105fd57600080fd5b600060208284031215611be657600080fd5b813561066c81611bbf565b600080600060608486031215611c0657600080fd5b8335611c1181611bbf565b92506020840135611c2181611bbf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611c7157611c71611c32565b604052919050565b60008060408385031215611c8c57600080fd5b8235611c9781611bbf565b915060208381013567ffffffffffffffff80821115611cb557600080fd5b818601915086601f830112611cc957600080fd5b813581811115611cdb57611cdb611c32565b611ced601f8201601f19168501611c48565b91508082528784828501011115611d0357600080fd5b80848401858401376000848284010152508093505050509250929050565b60008060008060808587031215611d3757600080fd5b8435611d4281611bbf565b93506020850135611d5281611bbf565b92506040850135611d6281611bbf565b9396929550929360600135925050565b600060808284031215611d8457600080fd5b50919050565b60008060a08385031215611d9d57600080fd5b8235611da881611bbf565b9150611db78460208501611d72565b90509250929050565b600060808284031215611dd257600080fd5b61066c8383611d72565b634e487b7160e01b600052602160045260246000fd5b60038110611e1057634e487b7160e01b600052602160045260246000fd5b9052565b611e1f828251611df2565b6020810151611e316020840182611df2565b506040810151611e446040840182611df2565b506060810151610c9e6060840182611df2565b608081016105128284611e14565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b600060208284031215611f0f57600080fd5b815161066c81611bbf565b6001600160a01b039485168152602081019390935292166040820152901515606082015260800190565b600381106105fd57600080fd5b600060808284031215611f6357600080fd5b6040516080810181811067ffffffffffffffff82111715611f8657611f86611c32565b6040528235611f9481611f44565b81526020830135611fa481611f44565b60208201526040830135611fb781611f44565b60408201526060830135611fca81611f44565b60608201529392505050565b600060208284031215611fe857600080fd5b5051919050565b6001600160a01b038316815260a0810161066c6020830184611e14565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006020828403121561206957600080fd5b813561066c81611f44565b6000813561051281611f44565b6003821061209f57634e487b7160e01b600052602160045260246000fd5b805462ff00008360101b1662ff0000198216178255505050565b600382106120d757634e487b7160e01b600052602160045260246000fd5b805463ff0000008360181b1663ff000000198216178255505050565b81356120fe81611f44565b6003811061211c57634e487b7160e01b600052602160045260246000fd5b815460ff821691508160ff198216178355602084013561213b81611f44565b6003811061215957634e487b7160e01b600052602160045260246000fd5b61ff008160081b168361ffff1984161717845550505061218461217e60408401612074565b82612081565b6107a961219360608401612074565b826120b9565b6001600160a01b038316815260a0810182356121b481611f44565b6121c16020840182611df2565b5060208301356121d081611f44565b6121dd6040840182611df2565b5060408301356121ec81611f44565b6121f96060840182611df2565b50606083013561220881611f44565b6122156080840182611df2565b509392505050565b60005b83811015612238578181015183820152602001612220565b50506000910152565b6000825161225381846020870161221d565b9190910192915050565b602081526000825180602084015261227c81604085016020870161221d565b601f01601f1916919091016040019291505056fec88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d8975360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c656455435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041a26469706673582212209d8e7e225e8fda000c166f5f0311960220729ec38657290252ef8ccd38865ad764736f6c63430008100033",
461
645
  "linkReferences": {},
462
646
  "deployedLinkReferences": {}
463
647
  }
@@ -65,6 +65,35 @@
65
65
  ],
66
66
  "stateMutability": "view",
67
67
  "type": "function"
68
+ },
69
+ {
70
+ "inputs": [
71
+ {
72
+ "internalType": "contract IEToken",
73
+ "name": "etoken",
74
+ "type": "address"
75
+ },
76
+ {
77
+ "internalType": "address",
78
+ "name": "provider",
79
+ "type": "address"
80
+ },
81
+ {
82
+ "internalType": "uint256",
83
+ "name": "amount",
84
+ "type": "uint256"
85
+ }
86
+ ],
87
+ "name": "acceptsWithdrawal",
88
+ "outputs": [
89
+ {
90
+ "internalType": "bool",
91
+ "name": "",
92
+ "type": "bool"
93
+ }
94
+ ],
95
+ "stateMutability": "view",
96
+ "type": "function"
68
97
  }
69
98
  ],
70
99
  "bytecode": "0x",
@@ -173,8 +173,8 @@
173
173
  "type": "function"
174
174
  }
175
175
  ],
176
- "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638b98dad01161008c578063a23a166111610066578063a23a16611461016e578063a88ecaa21461017c578063c1bd03a61461018a578063fef87f0b1461019857600080fd5b80638b98dad014610144578063933c234b1461015257806396047c991461016057600080fd5b806311f34418146100d45780632bac8ca3146100ff578063362466de1461010d578063731e0f7f1461011b5780637874bf9814610129578063800915a514610136575b600080fd5b6100e2632dd9c4bb60e21b81565b6040516001600160e01b0319909116815260200160405180910390f35b6100e263272b8c4760e01b81565b6100e2634d15eb0360e01b81565b6100e263a219a02560e01b81565b6100e2629d19af60e21b81565b6100e2633411f57560e11b81565b6100e263da40804f60e01b81565b6100e2637965db0b60e01b81565b6100e26380ac58cd60e01b81565b6100e26301ffc9a760e01b81565b6100e2631e670a9760e21b81565b6100e26336372b0760e01b81565b6100e263191a7d6b60e11b8156fea26469706673582212202407841d76a6df631d4e3677299367c0e4e79a67550cfe56e975629ac4befc2e64736f6c63430008100033",
177
- "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638b98dad01161008c578063a23a166111610066578063a23a16611461016e578063a88ecaa21461017c578063c1bd03a61461018a578063fef87f0b1461019857600080fd5b80638b98dad014610144578063933c234b1461015257806396047c991461016057600080fd5b806311f34418146100d45780632bac8ca3146100ff578063362466de1461010d578063731e0f7f1461011b5780637874bf9814610129578063800915a514610136575b600080fd5b6100e2632dd9c4bb60e21b81565b6040516001600160e01b0319909116815260200160405180910390f35b6100e263272b8c4760e01b81565b6100e2634d15eb0360e01b81565b6100e263a219a02560e01b81565b6100e2629d19af60e21b81565b6100e2633411f57560e11b81565b6100e263da40804f60e01b81565b6100e2637965db0b60e01b81565b6100e26380ac58cd60e01b81565b6100e26301ffc9a760e01b81565b6100e2631e670a9760e21b81565b6100e26336372b0760e01b81565b6100e263191a7d6b60e11b8156fea26469706673582212202407841d76a6df631d4e3677299367c0e4e79a67550cfe56e975629ac4befc2e64736f6c63430008100033",
176
+ "bytecode": "0x608060405234801561001057600080fd5b506101dc806100206000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638b98dad01161008c578063a23a166111610066578063a23a16611461016e578063a88ecaa21461017c578063c1bd03a61461018a578063fef87f0b1461019857600080fd5b80638b98dad014610144578063933c234b1461015257806396047c991461016057600080fd5b806311f34418146100d45780632bac8ca3146100ff578063362466de1461010d578063731e0f7f1461011b5780637874bf9814610129578063800915a514610136575b600080fd5b6100e2632dd9c4bb60e21b81565b6040516001600160e01b0319909116815260200160405180910390f35b6100e263272b8c4760e01b81565b6100e2634d15eb0360e01b81565b6100e263a219a02560e01b81565b6100e2629d19af60e21b81565b6100e263f8722d8960e01b81565b6100e263da40804f60e01b81565b6100e2637965db0b60e01b81565b6100e26380ac58cd60e01b81565b6100e26301ffc9a760e01b81565b6100e2631e670a9760e21b81565b6100e26336372b0760e01b81565b6100e263191a7d6b60e11b8156fea2646970667358221220cddc8659dab91b70f841d76d5d02f97f233e334f038d92a7f054271ff1b35f1d64736f6c63430008100033",
177
+ "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638b98dad01161008c578063a23a166111610066578063a23a16611461016e578063a88ecaa21461017c578063c1bd03a61461018a578063fef87f0b1461019857600080fd5b80638b98dad014610144578063933c234b1461015257806396047c991461016057600080fd5b806311f34418146100d45780632bac8ca3146100ff578063362466de1461010d578063731e0f7f1461011b5780637874bf9814610129578063800915a514610136575b600080fd5b6100e2632dd9c4bb60e21b81565b6040516001600160e01b0319909116815260200160405180910390f35b6100e263272b8c4760e01b81565b6100e2634d15eb0360e01b81565b6100e263a219a02560e01b81565b6100e2629d19af60e21b81565b6100e263f8722d8960e01b81565b6100e263da40804f60e01b81565b6100e2637965db0b60e01b81565b6100e26380ac58cd60e01b81565b6100e26301ffc9a760e01b81565b6100e2631e670a9760e21b81565b6100e26336372b0760e01b81565b6100e263191a7d6b60e11b8156fea2646970667358221220cddc8659dab91b70f841d76d5d02f97f233e334f038d92a7f054271ff1b35f1d64736f6c63430008100033",
178
178
  "linkReferences": {},
179
179
  "deployedLinkReferences": {}
180
180
  }
@@ -220,6 +220,36 @@ contract EToken is Reserve, IERC20Metadata, IEToken {
220
220
  return _tsScaled.getScale(tokenInterestRate()).rayMul(principalBalance.wadToRay()).rayToWad();
221
221
  }
222
222
 
223
+ // Methods following AAVE's IScaledBalanceToken, to simplify future integrations
224
+
225
+ /**
226
+ * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the
227
+ * updated stored balance divided by the EToken's scale index
228
+ * @param user The user whose balance is calculated
229
+ * @return The scaled balance of the user
230
+ **/
231
+ function scaledBalanceOf(address user) external view returns (uint256) {
232
+ return _balances[user];
233
+ }
234
+
235
+ /**
236
+ * @dev Returns the scaled balance of the user and the scaled total supply.
237
+ * @param user The address of the user
238
+ * @return The scaled balance of the user
239
+ * @return The scaled balance and the scaled total supply
240
+ **/
241
+ function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256) {
242
+ return (_balances[user], uint256(_tsScaled.amount));
243
+ }
244
+
245
+ /**
246
+ * @dev Returns the (un)scaled total supply of the EToken. Equals to the sum of `scaledBalanceOf(x)` of all users
247
+ * @return The scaled total supply
248
+ **/
249
+ function scaledTotalSupply() external view returns (uint256) {
250
+ return uint256(_tsScaled.amount);
251
+ }
252
+
223
253
  /**
224
254
  * @dev See {IERC20-transfer}.
225
255
  *
@@ -500,9 +530,8 @@ contract EToken is Reserve, IERC20Metadata, IEToken {
500
530
  }
501
531
 
502
532
  function fundsAvailableToLock() public view returns (uint256) {
503
- uint256 totalSupply_ = this.totalSupply();
504
- if (totalSupply_ > uint256(_scr.scr))
505
- return (totalSupply_ - uint256(_scr.scr)).wadMul(maxUtilizationRate());
533
+ uint256 supply = this.totalSupply().wadMul(maxUtilizationRate());
534
+ if (supply > uint256(_scr.scr)) return supply - uint256(_scr.scr);
506
535
  else return 0;
507
536
  }
508
537
 
@@ -645,8 +674,15 @@ contract EToken is Reserve, IERC20Metadata, IEToken {
645
674
  * The only limit for withdraws is the `totalWithdrawable()` function, that's affected by the relation between the
646
675
  * scr and the totalSupply.
647
676
  */
648
- amount = Math.min(amount, Math.min(balanceOf(provider), totalWithdrawable()));
677
+ uint256 maxWithdraw = Math.min(balanceOf(provider), totalWithdrawable());
678
+ if (amount == type(uint256).max) amount = maxWithdraw;
649
679
  if (amount == 0) return 0;
680
+ require(amount <= maxWithdraw, "amount > max withdrawable");
681
+ require(
682
+ address(_params.whitelist) == address(0) ||
683
+ _params.whitelist.acceptsWithdrawal(this, provider, amount),
684
+ "Liquidity Provider not whitelisted"
685
+ );
650
686
  _burn(provider, amount);
651
687
  _updateTokenInterestRate();
652
688
  _transferTo(provider, amount);
@@ -14,10 +14,27 @@ import {IEToken} from "./interfaces/IEToken.sol";
14
14
  */
15
15
  contract LPManualWhitelist is ILPWhitelist, PolicyPoolComponent {
16
16
  bytes32 public constant LP_WHITELIST_ROLE = keccak256("LP_WHITELIST_ROLE");
17
+ bytes32 public constant LP_WHITELIST_ADMIN_ROLE = keccak256("LP_WHITELIST_ADMIN_ROLE");
17
18
 
18
- mapping(address => bool) private _whitelisted;
19
+ /**
20
+ * @dev Enum with the different options for whitelisting status
21
+ */
22
+ enum WhitelistOptions {
23
+ undefined,
24
+ whitelisted,
25
+ blacklisted
26
+ }
27
+
28
+ struct WhitelistStatus {
29
+ WhitelistOptions deposit;
30
+ WhitelistOptions withdraw;
31
+ WhitelistOptions sendTransfer;
32
+ WhitelistOptions receiveTransfer;
33
+ }
19
34
 
20
- event LPWhitelisted(address provider, bool whitelisted);
35
+ mapping(address => WhitelistStatus) private _wlStatus;
36
+
37
+ event LPWhitelistStatusChanged(address provider, WhitelistStatus whitelisted);
21
38
 
22
39
  /// @custom:oz-upgrades-unsafe-allow constructor
23
40
  // solhint-disable-next-line no-empty-blocks
@@ -26,18 +43,62 @@ contract LPManualWhitelist is ILPWhitelist, PolicyPoolComponent {
26
43
  /**
27
44
  * @dev Initializes the Whitelist contract
28
45
  */
29
- function initialize() public initializer {
46
+ function initialize(WhitelistStatus calldata defaultStatus) public initializer {
47
+ __LPManualWhitelist_init(defaultStatus);
48
+ }
49
+
50
+ // solhint-disable-next-line func-name-mixedcase
51
+ function __LPManualWhitelist_init(WhitelistStatus calldata defaultStatus)
52
+ internal
53
+ onlyInitializing
54
+ {
30
55
  __PolicyPoolComponent_init();
56
+ __LPManualWhitelist_init_unchained(defaultStatus);
31
57
  }
32
58
 
33
- function whitelistAddress(address provider, bool whitelisted)
59
+ // solhint-disable-next-line func-name-mixedcase
60
+ function __LPManualWhitelist_init_unchained(WhitelistStatus calldata defaultStatus)
61
+ internal
62
+ onlyInitializing
63
+ {
64
+ _checkDefaultStatus(defaultStatus);
65
+ _wlStatus[address(0)] = defaultStatus;
66
+ emit LPWhitelistStatusChanged(address(0), defaultStatus);
67
+ }
68
+
69
+ function whitelistAddress(address provider, WhitelistStatus calldata newStatus)
34
70
  external
35
71
  onlyComponentRole(LP_WHITELIST_ROLE)
36
72
  {
37
- if (_whitelisted[provider] != whitelisted) {
38
- _whitelisted[provider] = whitelisted;
39
- emit LPWhitelisted(provider, whitelisted);
40
- }
73
+ require(provider != address(0), "You can't change the defaults");
74
+ _whitelistAddress(provider, newStatus);
75
+ }
76
+
77
+ function _checkDefaultStatus(WhitelistStatus calldata newStatus) internal pure {
78
+ require(
79
+ newStatus.deposit != WhitelistOptions.undefined &&
80
+ newStatus.withdraw != WhitelistOptions.undefined &&
81
+ newStatus.sendTransfer != WhitelistOptions.undefined &&
82
+ newStatus.receiveTransfer != WhitelistOptions.undefined,
83
+ "You need to define the default status for all the operations"
84
+ );
85
+ }
86
+
87
+ function setWhitelistDefaults(WhitelistStatus calldata newStatus)
88
+ external
89
+ onlyComponentRole(LP_WHITELIST_ADMIN_ROLE)
90
+ {
91
+ _checkDefaultStatus(newStatus);
92
+ _whitelistAddress(address(0), newStatus);
93
+ }
94
+
95
+ function getWhitelistDefaults() external view returns (WhitelistStatus memory) {
96
+ return _wlStatus[address(0)];
97
+ }
98
+
99
+ function _whitelistAddress(address provider, WhitelistStatus memory newStatus) internal {
100
+ _wlStatus[provider] = newStatus;
101
+ emit LPWhitelistStatusChanged(provider, newStatus);
41
102
  }
42
103
 
43
104
  /**
@@ -52,16 +113,41 @@ contract LPManualWhitelist is ILPWhitelist, PolicyPoolComponent {
52
113
  address provider,
53
114
  uint256
54
115
  ) external view override returns (bool) {
55
- return _whitelisted[provider];
116
+ WhitelistOptions wl = _wlStatus[provider].deposit;
117
+ if (wl == WhitelistOptions.undefined) {
118
+ wl = _wlStatus[address(0)].deposit;
119
+ }
120
+ return wl == WhitelistOptions.whitelisted;
121
+ }
122
+
123
+ function acceptsWithdrawal(
124
+ IEToken,
125
+ address provider,
126
+ uint256
127
+ ) external view override returns (bool) {
128
+ WhitelistOptions wl = _wlStatus[provider].withdraw;
129
+ if (wl == WhitelistOptions.undefined) {
130
+ wl = _wlStatus[address(0)].withdraw;
131
+ }
132
+ return wl == WhitelistOptions.whitelisted;
56
133
  }
57
134
 
58
135
  function acceptsTransfer(
59
136
  IEToken,
60
- address,
137
+ address providerFrom,
61
138
  address providerTo,
62
139
  uint256
63
140
  ) external view override returns (bool) {
64
- return _whitelisted[providerTo];
141
+ WhitelistOptions wl = _wlStatus[providerFrom].sendTransfer;
142
+ if (wl == WhitelistOptions.undefined) {
143
+ wl = _wlStatus[address(0)].sendTransfer;
144
+ }
145
+ if (wl != WhitelistOptions.whitelisted) return false;
146
+ wl = _wlStatus[providerTo].receiveTransfer;
147
+ if (wl == WhitelistOptions.undefined) {
148
+ wl = _wlStatus[address(0)].receiveTransfer;
149
+ }
150
+ return wl == WhitelistOptions.whitelisted;
65
151
  }
66
152
 
67
153
  /**