@sudobility/contracts 1.10.1 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/artifacts/contracts/Mailer.sol/Mailer.d.ts +67 -2
  2. package/artifacts/contracts/Mailer.sol/Mailer.dbg.json +1 -1
  3. package/artifacts/contracts/Mailer.sol/Mailer.json +67 -2
  4. package/artifacts/contracts/MockUSDC.sol/MockUSDC.dbg.json +1 -1
  5. package/artifacts/contracts/interfaces/IERC20.sol/IERC20.dbg.json +1 -1
  6. package/dist/evm/typechain-types/Mailer.d.ts +50 -2
  7. package/dist/evm/typechain-types/Mailer.d.ts.map +1 -1
  8. package/dist/evm/typechain-types/factories/Mailer__factory.d.ts +53 -1
  9. package/dist/evm/typechain-types/factories/Mailer__factory.d.ts.map +1 -1
  10. package/dist/evm/typechain-types/factories/Mailer__factory.js +66 -1
  11. package/dist/evm/typechain-types/factories/Mailer__factory.js.map +1 -1
  12. package/dist/unified/typechain-types/Mailer.d.ts +50 -2
  13. package/dist/unified/typechain-types/Mailer.d.ts.map +1 -1
  14. package/dist/unified/typechain-types/factories/Mailer__factory.d.ts +53 -1
  15. package/dist/unified/typechain-types/factories/Mailer__factory.d.ts.map +1 -1
  16. package/dist/unified/typechain-types/factories/Mailer__factory.js +66 -1
  17. package/dist/unified/typechain-types/factories/Mailer__factory.js.map +1 -1
  18. package/dist/unified-esm/typechain-types/Mailer.d.ts +50 -2
  19. package/dist/unified-esm/typechain-types/Mailer.d.ts.map +1 -1
  20. package/dist/unified-esm/typechain-types/factories/Mailer__factory.d.ts +53 -1
  21. package/dist/unified-esm/typechain-types/factories/Mailer__factory.d.ts.map +1 -1
  22. package/dist/unified-esm/typechain-types/factories/Mailer__factory.js +66 -1
  23. package/dist/unified-esm/typechain-types/factories/Mailer__factory.js.map +1 -1
  24. package/package.json +6 -1
  25. package/programs/mailer/src/lib.rs +305 -13
  26. package/programs/mailer/tests/integration_tests.rs +206 -3
  27. package/typechain-types/Mailer.ts +79 -0
  28. package/typechain-types/factories/Mailer__factory.ts +66 -1
@@ -389,6 +389,205 @@ async fn test_send_standard_message() {
389
389
  assert_eq!(mailer_state.owner_claimable, 10_000); // Only 10% fee
390
390
  }
391
391
 
392
+ #[tokio::test]
393
+ async fn test_send_through_webhook_priority() {
394
+ let program_test = ProgramTest::new(
395
+ "mailer",
396
+ program_id(),
397
+ processor!(mailer::process_instruction),
398
+ );
399
+ let (mut banks_client, payer, recent_blockhash) = program_test.start().await;
400
+
401
+ // Setup similar to priority test
402
+ let usdc_mint = create_usdc_mint(&mut banks_client, &payer, recent_blockhash).await;
403
+ let (mailer_pda, _) = get_mailer_pda();
404
+
405
+ // Initialize the program
406
+ let init_instruction = Instruction::new_with_borsh(
407
+ program_id(),
408
+ &MailerInstruction::Initialize { usdc_mint },
409
+ vec![
410
+ AccountMeta::new(payer.pubkey(), true),
411
+ AccountMeta::new(mailer_pda, false),
412
+ AccountMeta::new_readonly(system_program::id(), false),
413
+ ],
414
+ );
415
+
416
+ let mut transaction = Transaction::new_with_payer(&[init_instruction], Some(&payer.pubkey()));
417
+ transaction.sign(&[&payer], recent_blockhash);
418
+ banks_client.process_transaction(transaction).await.unwrap();
419
+
420
+ // Create token accounts
421
+ let sender_usdc = create_token_account(
422
+ &mut banks_client,
423
+ &payer,
424
+ recent_blockhash,
425
+ &usdc_mint,
426
+ &payer.pubkey(),
427
+ )
428
+ .await;
429
+ let mailer_usdc = create_token_account(
430
+ &mut banks_client,
431
+ &payer,
432
+ recent_blockhash,
433
+ &usdc_mint,
434
+ &mailer_pda,
435
+ )
436
+ .await;
437
+
438
+ // Mint USDC to sender
439
+ mint_to(
440
+ &mut banks_client,
441
+ &payer,
442
+ recent_blockhash,
443
+ &usdc_mint,
444
+ &sender_usdc,
445
+ 1_000_000,
446
+ )
447
+ .await; // 1 USDC
448
+
449
+ // Get recipient claim PDA
450
+ let (recipient_claim_pda, _) = get_claim_pda(&payer.pubkey());
451
+
452
+ // Send message through webhook with revenue sharing (priority mode)
453
+ let instruction_data = MailerInstruction::SendThroughWebhook {
454
+ to: payer.pubkey(),
455
+ webhook_id: "webhook-123".to_string(),
456
+ revenue_share_to_receiver: true,
457
+ resolve_sender_to_name: false,
458
+ };
459
+
460
+ let instruction = Instruction::new_with_borsh(
461
+ program_id(),
462
+ &instruction_data,
463
+ vec![
464
+ AccountMeta::new(payer.pubkey(), true),
465
+ AccountMeta::new(recipient_claim_pda, false),
466
+ AccountMeta::new(mailer_pda, false), // Must be writable for record_shares to update owner_claimable
467
+ AccountMeta::new(sender_usdc, false),
468
+ AccountMeta::new(mailer_usdc, false),
469
+ AccountMeta::new_readonly(spl_token::id(), false),
470
+ AccountMeta::new_readonly(system_program::id(), false),
471
+ ],
472
+ );
473
+
474
+ let mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));
475
+ transaction.sign(&[&payer], recent_blockhash);
476
+ banks_client.process_transaction(transaction).await.unwrap();
477
+
478
+ // Verify recipient claim was created with correct amount
479
+ let claim_account = banks_client
480
+ .get_account(recipient_claim_pda)
481
+ .await
482
+ .unwrap()
483
+ .unwrap();
484
+ let recipient_claim: RecipientClaim =
485
+ BorshDeserialize::deserialize(&mut &claim_account.data[8..]).unwrap();
486
+
487
+ assert_eq!(recipient_claim.recipient, payer.pubkey());
488
+ assert_eq!(recipient_claim.amount, 90_000); // 90% of send_fee (100,000)
489
+
490
+ // Verify mailer state was updated with owner share
491
+ let mailer_account = banks_client.get_account(mailer_pda).await.unwrap().unwrap();
492
+ let mailer_state: MailerState =
493
+ BorshDeserialize::deserialize(&mut &mailer_account.data[8..]).unwrap();
494
+
495
+ assert_eq!(mailer_state.owner_claimable, 10_000); // 10% of send_fee
496
+ }
497
+
498
+ #[tokio::test]
499
+ async fn test_send_through_webhook_standard() {
500
+ let program_test = ProgramTest::new(
501
+ "mailer",
502
+ program_id(),
503
+ processor!(mailer::process_instruction),
504
+ );
505
+ let (mut banks_client, payer, recent_blockhash) = program_test.start().await;
506
+
507
+ // Setup similar to standard test
508
+ let usdc_mint = create_usdc_mint(&mut banks_client, &payer, recent_blockhash).await;
509
+ let (mailer_pda, _) = get_mailer_pda();
510
+
511
+ // Initialize the program
512
+ let init_instruction = Instruction::new_with_borsh(
513
+ program_id(),
514
+ &MailerInstruction::Initialize { usdc_mint },
515
+ vec![
516
+ AccountMeta::new(payer.pubkey(), true),
517
+ AccountMeta::new(mailer_pda, false),
518
+ AccountMeta::new_readonly(system_program::id(), false),
519
+ ],
520
+ );
521
+
522
+ let mut transaction = Transaction::new_with_payer(&[init_instruction], Some(&payer.pubkey()));
523
+ transaction.sign(&[&payer], recent_blockhash);
524
+ banks_client.process_transaction(transaction).await.unwrap();
525
+
526
+ // Create token accounts
527
+ let sender_usdc = create_token_account(
528
+ &mut banks_client,
529
+ &payer,
530
+ recent_blockhash,
531
+ &usdc_mint,
532
+ &payer.pubkey(),
533
+ )
534
+ .await;
535
+ let mailer_usdc = create_token_account(
536
+ &mut banks_client,
537
+ &payer,
538
+ recent_blockhash,
539
+ &usdc_mint,
540
+ &mailer_pda,
541
+ )
542
+ .await;
543
+
544
+ // Mint USDC to sender
545
+ mint_to(
546
+ &mut banks_client,
547
+ &payer,
548
+ recent_blockhash,
549
+ &usdc_mint,
550
+ &sender_usdc,
551
+ 1_000_000,
552
+ )
553
+ .await;
554
+
555
+ // Get recipient claim PDA (needed even if not used for standard send)
556
+ let (recipient_claim_pda, _) = get_claim_pda(&payer.pubkey());
557
+
558
+ // Send webhook message (standard mode - no revenue sharing)
559
+ let instruction_data = MailerInstruction::SendThroughWebhook {
560
+ to: payer.pubkey(),
561
+ webhook_id: "webhook-456".to_string(),
562
+ revenue_share_to_receiver: false,
563
+ resolve_sender_to_name: false,
564
+ };
565
+
566
+ let instruction = Instruction::new_with_borsh(
567
+ program_id(),
568
+ &instruction_data,
569
+ vec![
570
+ AccountMeta::new(payer.pubkey(), true),
571
+ AccountMeta::new_readonly(recipient_claim_pda, false), // Not used for standard send but required
572
+ AccountMeta::new(mailer_pda, false), // Needs to be writable to update owner_claimable
573
+ AccountMeta::new(sender_usdc, false),
574
+ AccountMeta::new(mailer_usdc, false),
575
+ AccountMeta::new_readonly(spl_token::id(), false),
576
+ AccountMeta::new_readonly(system_program::id(), false),
577
+ ],
578
+ );
579
+
580
+ let mut transaction = Transaction::new_with_payer(&[instruction], Some(&payer.pubkey()));
581
+ transaction.sign(&[&payer], recent_blockhash);
582
+ banks_client.process_transaction(transaction).await.unwrap();
583
+
584
+ // Verify only owner fee was charged (10% of send_fee = 10,000)
585
+ let mailer_account = banks_client.get_account(mailer_pda).await.unwrap().unwrap();
586
+ let mailer_state: MailerState =
587
+ BorshDeserialize::deserialize(&mut &mailer_account.data[8..]).unwrap();
588
+ assert_eq!(mailer_state.owner_claimable, 10_000); // Only 10% fee
589
+ }
590
+
392
591
  #[tokio::test]
393
592
  async fn test_claim_recipient_share() {
394
593
  let program_test = ProgramTest::new(
@@ -980,10 +1179,14 @@ async fn test_claim_expired_shares_moves_funds_to_owner() {
980
1179
  .process_transaction(transaction)
981
1180
  .await
982
1181
  .unwrap();
983
- recent_blockhash = context.banks_client.get_latest_blockhash().await.unwrap();
984
1182
 
985
- // Warp forward so the claim expires (claim period is 60 days)
986
- context.warp_to_slot(20_000_000).unwrap();
1183
+ // Warp forward so the claim expires (claim period is 60 days = 5,184,000 seconds)
1184
+ // Manually set the clock to a future timestamp beyond the claim period
1185
+ use solana_sdk::clock::Clock;
1186
+ let mut clock = context.banks_client.get_sysvar::<Clock>().await.unwrap();
1187
+ clock.unix_timestamp += 60 * 24 * 60 * 60 + 1; // 60 days + 1 second
1188
+ context.set_sysvar(&clock);
1189
+
987
1190
  recent_blockhash = context.banks_client.get_latest_blockhash().await.unwrap();
988
1191
 
989
1192
  // Owner reclaims expired shares
@@ -54,6 +54,7 @@ export interface MailerInterface extends Interface {
54
54
  | "sendFee"
55
55
  | "sendPrepared"
56
56
  | "sendPreparedToEmailAddress"
57
+ | "sendThroughWebhook"
57
58
  | "sendToEmailAddress"
58
59
  | "setCustomFeePercentage"
59
60
  | "setDelegationFee"
@@ -80,6 +81,7 @@ export interface MailerInterface extends Interface {
80
81
  | "PreparedMailSentToEmail"
81
82
  | "RecipientClaimed"
82
83
  | "SharesRecorded"
84
+ | "WebhookMailSent"
83
85
  ): EventFragment;
84
86
 
85
87
  encodeFunctionData(
@@ -176,6 +178,10 @@ export interface MailerInterface extends Interface {
176
178
  functionFragment: "sendPreparedToEmailAddress",
177
179
  values: [string, string]
178
180
  ): string;
181
+ encodeFunctionData(
182
+ functionFragment: "sendThroughWebhook",
183
+ values: [AddressLike, string, boolean, boolean]
184
+ ): string;
179
185
  encodeFunctionData(
180
186
  functionFragment: "sendToEmailAddress",
181
187
  values: [string, string, string]
@@ -283,6 +289,10 @@ export interface MailerInterface extends Interface {
283
289
  functionFragment: "sendPreparedToEmailAddress",
284
290
  data: BytesLike
285
291
  ): Result;
292
+ decodeFunctionResult(
293
+ functionFragment: "sendThroughWebhook",
294
+ data: BytesLike
295
+ ): Result;
286
296
  decodeFunctionResult(
287
297
  functionFragment: "sendToEmailAddress",
288
298
  data: BytesLike
@@ -553,6 +563,34 @@ export namespace SharesRecordedEvent {
553
563
  export type LogDescription = TypedLogDescription<Event>;
554
564
  }
555
565
 
566
+ export namespace WebhookMailSentEvent {
567
+ export type InputTuple = [
568
+ from: AddressLike,
569
+ to: AddressLike,
570
+ webhookId: string,
571
+ revenueShareToReceiver: boolean,
572
+ resolveSenderToName: boolean
573
+ ];
574
+ export type OutputTuple = [
575
+ from: string,
576
+ to: string,
577
+ webhookId: string,
578
+ revenueShareToReceiver: boolean,
579
+ resolveSenderToName: boolean
580
+ ];
581
+ export interface OutputObject {
582
+ from: string;
583
+ to: string;
584
+ webhookId: string;
585
+ revenueShareToReceiver: boolean;
586
+ resolveSenderToName: boolean;
587
+ }
588
+ export type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
589
+ export type Filter = TypedDeferredTopicFilter<Event>;
590
+ export type Log = TypedEventLog<Event>;
591
+ export type LogDescription = TypedLogDescription<Event>;
592
+ }
593
+
556
594
  export interface Mailer extends BaseContract {
557
595
  connect(runner?: ContractRunner | null): Mailer;
558
596
  waitForDeployment(): Promise<this>;
@@ -713,6 +751,17 @@ export interface Mailer extends BaseContract {
713
751
  "nonpayable"
714
752
  >;
715
753
 
754
+ sendThroughWebhook: TypedContractMethod<
755
+ [
756
+ to: AddressLike,
757
+ webhookId: string,
758
+ revenueShareToReceiver: boolean,
759
+ resolveSenderToName: boolean
760
+ ],
761
+ [void],
762
+ "nonpayable"
763
+ >;
764
+
716
765
  sendToEmailAddress: TypedContractMethod<
717
766
  [toEmail: string, subject: string, body: string],
718
767
  [void],
@@ -866,6 +915,18 @@ export interface Mailer extends BaseContract {
866
915
  [void],
867
916
  "nonpayable"
868
917
  >;
918
+ getFunction(
919
+ nameOrSignature: "sendThroughWebhook"
920
+ ): TypedContractMethod<
921
+ [
922
+ to: AddressLike,
923
+ webhookId: string,
924
+ revenueShareToReceiver: boolean,
925
+ resolveSenderToName: boolean
926
+ ],
927
+ [void],
928
+ "nonpayable"
929
+ >;
869
930
  getFunction(
870
931
  nameOrSignature: "sendToEmailAddress"
871
932
  ): TypedContractMethod<
@@ -1005,6 +1066,13 @@ export interface Mailer extends BaseContract {
1005
1066
  SharesRecordedEvent.OutputTuple,
1006
1067
  SharesRecordedEvent.OutputObject
1007
1068
  >;
1069
+ getEvent(
1070
+ key: "WebhookMailSent"
1071
+ ): TypedContractEvent<
1072
+ WebhookMailSentEvent.InputTuple,
1073
+ WebhookMailSentEvent.OutputTuple,
1074
+ WebhookMailSentEvent.OutputObject
1075
+ >;
1008
1076
 
1009
1077
  filters: {
1010
1078
  "ContractPaused()": TypedContractEvent<
@@ -1182,5 +1250,16 @@ export interface Mailer extends BaseContract {
1182
1250
  SharesRecordedEvent.OutputTuple,
1183
1251
  SharesRecordedEvent.OutputObject
1184
1252
  >;
1253
+
1254
+ "WebhookMailSent(address,address,string,bool,bool)": TypedContractEvent<
1255
+ WebhookMailSentEvent.InputTuple,
1256
+ WebhookMailSentEvent.OutputTuple,
1257
+ WebhookMailSentEvent.OutputObject
1258
+ >;
1259
+ WebhookMailSent: TypedContractEvent<
1260
+ WebhookMailSentEvent.InputTuple,
1261
+ WebhookMailSentEvent.OutputTuple,
1262
+ WebhookMailSentEvent.OutputObject
1263
+ >;
1185
1264
  };
1186
1265
  }
@@ -413,6 +413,43 @@ const _abi = [
413
413
  name: "SharesRecorded",
414
414
  type: "event",
415
415
  },
416
+ {
417
+ anonymous: false,
418
+ inputs: [
419
+ {
420
+ indexed: true,
421
+ internalType: "address",
422
+ name: "from",
423
+ type: "address",
424
+ },
425
+ {
426
+ indexed: true,
427
+ internalType: "address",
428
+ name: "to",
429
+ type: "address",
430
+ },
431
+ {
432
+ indexed: true,
433
+ internalType: "string",
434
+ name: "webhookId",
435
+ type: "string",
436
+ },
437
+ {
438
+ indexed: false,
439
+ internalType: "bool",
440
+ name: "revenueShareToReceiver",
441
+ type: "bool",
442
+ },
443
+ {
444
+ indexed: false,
445
+ internalType: "bool",
446
+ name: "resolveSenderToName",
447
+ type: "bool",
448
+ },
449
+ ],
450
+ name: "WebhookMailSent",
451
+ type: "event",
452
+ },
416
453
  {
417
454
  inputs: [],
418
455
  name: "CLAIM_PERIOD",
@@ -832,6 +869,34 @@ const _abi = [
832
869
  stateMutability: "nonpayable",
833
870
  type: "function",
834
871
  },
872
+ {
873
+ inputs: [
874
+ {
875
+ internalType: "address",
876
+ name: "to",
877
+ type: "address",
878
+ },
879
+ {
880
+ internalType: "string",
881
+ name: "webhookId",
882
+ type: "string",
883
+ },
884
+ {
885
+ internalType: "bool",
886
+ name: "revenueShareToReceiver",
887
+ type: "bool",
888
+ },
889
+ {
890
+ internalType: "bool",
891
+ name: "resolveSenderToName",
892
+ type: "bool",
893
+ },
894
+ ],
895
+ name: "sendThroughWebhook",
896
+ outputs: [],
897
+ stateMutability: "nonpayable",
898
+ type: "function",
899
+ },
835
900
  {
836
901
  inputs: [
837
902
  {
@@ -922,7 +987,7 @@ const _abi = [
922
987
  ] as const;
923
988
 
924
989
  const _bytecode =
925
- "0x60c0604052620186a0600055629896806001553480156200001f57600080fd5b50604051620023ab380380620023ab8339810160408190526200004291620000b4565b6001600160a01b03821615806200006057506001600160a01b038116155b156200007f5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b039182166080521660a052620000ec565b80516001600160a01b0381168114620000af57600080fd5b919050565b60008060408385031215620000c857600080fd5b620000d38362000097565b9150620000e36020840162000097565b90509250929050565b60805160a0516121f8620001b360003960008181610385015281816104b0015281816105c70152818161067101528181610a1c01528181610abd01528181610ce9015281816110c20152818161116d0152818161145e015281816114f60152818161159f015261178f015260008181610224015281816106a3015281816107f0015281816108ef01528181610c0901528181610e1501528181610f140152818161133801528181611528015281816116ae0152818161197e0152611ae401526121f86000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c80637494b3231161011a578063b187bd26116100ad578063ced72f871161007c578063ced72f8714610466578063d15786871461046e578063ebf77de014610476578063f2292f0914610489578063fa26bb271461049257600080fd5b8063b187bd261461040f578063bbb2fe7c1461041a578063c5f0a58f1461042d578063cd564ccd1461043657600080fd5b80639ded51dd116100e95780639ded51dd146103af578063a3a336bf146103b7578063ac637c7a146103f3578063ae39279f1461040657600080fd5b80637494b323146103655780638456cb59146103785780638da5cb5b146103805780638db3c5fd146103a757600080fd5b80634a4e3bd51161019d578063585450141161016c57806358545014146103075780635c975abb1461031a57806369fe0e2d146103375780636a1c6e781461034a578063720e586f1461035257600080fd5b80634a4e3bd5146102d15780634b0b1b8b146102d957806355bfc81c146102e1578063569d7111146102f457600080fd5b8063358cbf0a116101d9578063358cbf0a1461028e5780633a8c3d6a146102965780633f4ba83a146102a95780633ff5aecd146102b157600080fd5b80620270a41461020a57806311eac8551461021f57806321241dfe14610263578063285298af1461027b575b600080fd5b61021d610218366004611d4d565b6104a5565b005b6102467f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61026d624f1a0081565b60405190815260200161025a565b61026d610289366004611d4d565b610592565b61021d6105bc565b61021d6102a4366004611dc9565b61076c565b61021d610a11565b61026d6102bf366004611d4d565b60066020526000908152604090205481565b61021d610ab2565b61021d610b53565b61021d6102ef366004611e44565b610cde565b61021d610302366004611e5d565b610d91565b61021d610315366004611d4d565b61102d565b6005546103279060ff1681565b604051901515815260200161025a565b61021d610345366004611e44565b6110b7565b61026d600a81565b61021d610360366004611d4d565b611162565b61021d610373366004611f04565b61129f565b61021d611453565b6102467f000000000000000000000000000000000000000000000000000000000000000081565b61026d605a81565b60015461026d565b6103de6103c5366004611d4d565b6002602052600090815260409020805460019091015482565b6040805192835260208301919091520161025a565b61021d610401366004611d4d565b611639565b61026d60005481565b60055460ff16610327565b61021d610428366004611f70565b611784565b61026d60015481565b610449610444366004611d4d565b6118a0565b60408051938452602084019290925215159082015260600161025a565b60005461026d565b60035461026d565b61021d610484366004611d4d565b6118ed565b61026d60035481565b61021d6104a0366004611f9a565b611a4b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104ee57604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615610512576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b0381166105395760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03811660008181526006602052604080822091909155517fb6ddac613582447a8fcbbe869621560344bdbe26d6fea183b1e155cd223d864d90610587906064815260200190565b60405180910390a250565b6001600160a01b0381166000908152600660205260408120546105b690606461204a565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060557604051635fc483c560e01b815260040160405180910390fd5b600454600103610628576040516345f5ce8b60e11b815260040160405180910390fd5b60016004556003546000036106505760405163493c1ab760e01b815260040160405180910390fd5b6003805460009182905560405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156106ec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610710919061205d565b905080610730576040516312171d8360e31b815260040160405180910390fd5b6040518281527f81521279371b94892737e5e06851c322303c72e5493db1453314ea08f55cb9379060200160405180910390a150506000600455565b60045460010361078f576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff16156107b8576040516306d39fcd60e41b815260040160405180910390fd5b81156108a25760006107cc33600054611bea565b905060008111801561086e57506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906108299033903090869060040161207a565b6020604051808303816000875af1158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c919061205d565b155b1561088c57604051634aa23e8f60e11b815260040160405180910390fd5b801561089c5761089c8682611c2b565b506109a5565b60006108b033600054611bea565b9050600060646108c1600a8461209e565b6108cb91906120b5565b905060008111801561096d57506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906109289033903090869060040161207a565b6020604051808303816000875af1158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b919061205d565b155b1561098b57604051634aa23e8f60e11b815260040160405180910390fd5b806003600082825461099d91906120d7565b909155505050505b83836040516109b59291906120ea565b6040805191829003822084151583528315156020840152916001600160a01b0388169133917f6c92a5c8a1b6c49076a075d1a499458f543fd2588ea971574373865f817ce83d910160405180910390a450506000600455505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a5a57604051635fc483c560e01b815260040160405180910390fd5b60055460ff16610a7d5760405163dcdde9dd60e01b815260040160405180910390fd5b6005805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610afb57604051635fc483c560e01b815260040160405180910390fd5b60055460ff16610b1e5760405163dcdde9dd60e01b815260040160405180910390fd5b6005805460ff191690556040517f15de7ad89d29fd1c6d2e6b1e878453569b4080edf34e0105faaa3bd52f01853090600090a1565b600454600103610b76576040516345f5ce8b60e11b815260040160405180910390fd5b60016004553360009081526002602052604081208054909103610bac5760405163493c1ab760e01b815260040160405180910390fd5b624f1a008160010154610bbf91906120d7565b421115610bdf5760405163493c1ab760e01b815260040160405180910390fd5b805460008083556001830181905560405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7e919061205d565b905080610c9e576040516312171d8360e31b815260040160405180910390fd5b60405182815233907f6673747791df7fe01578fcaebe4082d6d7680f052dbdd7d2cf345f88121be421906020015b60405180910390a25050600060045550565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d2757604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615610d4b576040516306d39fcd60e41b815260040160405180910390fd5b600180549082905560408051828152602081018490527f83b05743f1284b2faed08b3f927951e6663e5277e09a40c939f0dfe5075af77891015b60405180910390a15050565b600454600103610db4576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615610ddd576040516306d39fcd60e41b815260040160405180910390fd5b8115610ec7576000610df133600054611bea565b9050600081118015610e9357506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610e4e9033903090869060040161207a565b6020604051808303816000875af1158015610e6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e91919061205d565b155b15610eb157604051634aa23e8f60e11b815260040160405180910390fd5b8015610ec157610ec18882611c2b565b50610fca565b6000610ed533600054611bea565b905060006064610ee6600a8461209e565b610ef091906120b5565b9050600081118015610f9257506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610f4d9033903090869060040161207a565b6020604051808303816000875af1158015610f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f90919061205d565b155b15610fb057604051634aa23e8f60e11b815260040160405180910390fd5b8060036000828254610fc291906120d7565b909155505050505b866001600160a01b0316336001600160a01b03167f4576724219bca1c695ff280c4eba3f012c99252acd6c7d90c0407f63f8e6ad2688888888888860405161101796959493929190612123565b60405180910390a3505060006004555050505050565b600454600103611050576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615611079576040516306d39fcd60e41b815260040160405180910390fd5b6040516000906001600160a01b038316907f39e3ace752997a751bda5ecf126da84d0d23d5e61f3f56f26a6b22990d7beed8908390a3506000600455565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461110057604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615611124576040516306d39fcd60e41b815260040160405180910390fd5b600080549082905560408051828152602081018490527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df613029101610d85565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111ab57604051635fc483c560e01b815260040160405180910390fd5b6004546001036111ce576040516345f5ce8b60e11b815260040160405180910390fd5b60016004556001600160a01b0381166000908152600260205260408120805490910361120d5760405163493c1ab760e01b815260040160405180910390fd5b624f1a00816001015461122091906120d7565b421161123f576040516326f6703f60e11b815260040160405180910390fd5b80546000808355600183018190556003805483929061125f9084906120d7565b90915550506040518181526001600160a01b038416907fb4572b7f0782a4b7672a2341d00e4f1a0af99d81a3f8e959f25ff679eb31448190602001610ccc565b6004546001036112c2576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff16156112eb576040516306d39fcd60e41b815260040160405180910390fd5b60006112f933600054611bea565b90506000606461130a600a8461209e565b61131491906120b5565b90506000811180156113b657506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906113719033903090869060040161207a565b6020604051808303816000875af1158015611390573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b4919061205d565b155b156113d457604051634aa23e8f60e11b815260040160405180910390fd5b80600360008282546113e691906120d7565b90915550506040516113fb90859085906120ea565b6040518091039020336001600160a01b03167ffadda1f12158473f0f6a95450c4108a36fc8aa62f3dee6a9de94c8c599470443888860405161143e929190612165565b60405180910390a35050600060045550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461149c57604051635fc483c560e01b815260040160405180910390fd5b60055460ff16156114c0576040516306d39fcd60e41b815260040160405180910390fd5b6005805460ff191660011790556003541561160e576003805460009182905560405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611571573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611595919061205d565b90508015611605577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd836040516115f891815260200190565b60405180910390a261160b565b60038290555b50505b6040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b60045460010361165c576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615611685576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b03811615611746576001546040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd916116e691339130919060040161207a565b6020604051808303816000875af1158015611705573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611729919061205d565b61174657604051634aa23e8f60e11b815260040160405180910390fd5b6040516001600160a01b0382169033907f39e3ace752997a751bda5ecf126da84d0d23d5e61f3f56f26a6b22990d7beed890600090a3506000600455565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146117cd57604051635fc483c560e01b815260040160405180910390fd5b60055460ff16156117f1576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b0382166118185760405163e6c4247b60e01b815260040160405180910390fd5b606481111561183a57604051631f3b85d360e01b815260040160405180910390fd5b61184581606461204a565b6001600160a01b038316600081815260066020526040908190209290925590517fb6ddac613582447a8fcbbe869621560344bdbe26d6fea183b1e155cd223d864d906118949084815260200190565b60405180910390a25050565b6001600160a01b03811660009081526002602052604081208054600182015490929182916118d290624f1a00906120d7565b8154909350158015906118e457508242115b93959294505050565b60055460ff166119105760405163dcdde9dd60e01b815260040160405180910390fd5b6001600160a01b0381166000908152600260205260408120805490910361194a5760405163493c1ab760e01b815260040160405180910390fd5b805460008083556001830181905560405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156119c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119eb919061205d565b90508015611a3b57836001600160a01b03167f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd83604051611a2e91815260200190565b60405180910390a2611a45565b8183554260018401555b50505050565b600454600103611a6e576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615611a97576040516306d39fcd60e41b815260040160405180910390fd5b6000611aa533600054611bea565b905060006064611ab6600a8461209e565b611ac091906120b5565b9050600081118015611b6257506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90611b1d9033903090869060040161207a565b6020604051808303816000875af1158015611b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b60919061205d565b155b15611b8057604051634aa23e8f60e11b815260040160405180910390fd5b8060036000828254611b9291906120d7565b909155505060405133907fe137336c26280396075fb19ebe313eb4c539c2d845386ad035d8dee029bba31390611bd3908b908b908b908b908b908b90612179565b60405180910390a250506000600455505050505050565b6001600160a01b0382166000908152600660205260408120546064611c0f828261204a565b611c19908561209e565b611c2391906120b5565b949350505050565b611c38605a6000196120b5565b811115611c5857604051634eab2ea760e11b815260040160405180910390fd5b60006064611c67600a8461209e565b611c7191906120b5565b90506000611c7f828461204a565b6001600160a01b038516600090815260026020526040812080549293508392909190611cac9084906120d7565b90915550506001600160a01b03841660009081526002602052604081204260019091015560038054849290611ce29084906120d7565b909155505060408051828152602081018490526001600160a01b038616917fad83ccf4aebaf9db0cc5658b24e378a4a865a51b863e0289e3ee0e4947d97b1c910160405180910390a250505050565b80356001600160a01b0381168114611d4857600080fd5b919050565b600060208284031215611d5f57600080fd5b611d6882611d31565b9392505050565b60008083601f840112611d8157600080fd5b50813567ffffffffffffffff811115611d9957600080fd5b602083019150836020828501011115611db157600080fd5b9250929050565b8015158114611dc657600080fd5b50565b600080600080600060808688031215611de157600080fd5b611dea86611d31565b9450602086013567ffffffffffffffff811115611e0657600080fd5b611e1288828901611d6f565b9095509350506040860135611e2681611db8565b91506060860135611e3681611db8565b809150509295509295909350565b600060208284031215611e5657600080fd5b5035919050565b600080600080600080600060a0888a031215611e7857600080fd5b611e8188611d31565b9650602088013567ffffffffffffffff80821115611e9e57600080fd5b611eaa8b838c01611d6f565b909850965060408a0135915080821115611ec357600080fd5b50611ed08a828b01611d6f565b9095509350506060880135611ee481611db8565b91506080880135611ef481611db8565b8091505092959891949750929550565b60008060008060408587031215611f1a57600080fd5b843567ffffffffffffffff80821115611f3257600080fd5b611f3e88838901611d6f565b90965094506020870135915080821115611f5757600080fd5b50611f6487828801611d6f565b95989497509550505050565b60008060408385031215611f8357600080fd5b611f8c83611d31565b946020939093013593505050565b60008060008060008060608789031215611fb357600080fd5b863567ffffffffffffffff80821115611fcb57600080fd5b611fd78a838b01611d6f565b90985096506020890135915080821115611ff057600080fd5b611ffc8a838b01611d6f565b9096509450604089013591508082111561201557600080fd5b5061202289828a01611d6f565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105b6576105b6612034565b60006020828403121561206f57600080fd5b8151611d6881611db8565b6001600160a01b039384168152919092166020820152604081019190915260600190565b80820281158282048414176105b6576105b6612034565b6000826120d257634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156105b6576105b6612034565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600061213760808301888a6120fa565b828103602084015261214a8187896120fa565b94151560408401525050901515606090910152949350505050565b602081526000611c236020830184866120fa565b60608152600061218d60608301888a6120fa565b82810360208401526121a08187896120fa565b905082810360408401526121b58185876120fa565b999850505050505050505056fea26469706673582212208a82d8e37c43fe6ce0c564334fcf3525212c54604dc8ca3a5e602c719f3ed32864736f6c63430008180033";
990
+ "0x60c0604052620186a0600055629896806001553480156200001f57600080fd5b506040516200266e3803806200266e8339810160408190526200004291620000b4565b6001600160a01b03821615806200006057506001600160a01b038116155b156200007f5760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b039182166080521660a052620000ec565b80516001600160a01b0381168114620000af57600080fd5b919050565b60008060408385031215620000c857600080fd5b620000d38362000097565b9150620000e36020840162000097565b90509250929050565b60805160a0516124ad620001c1600039600081816103a3015281816104ce015281816105e50152818161068f01528181610a3b01528181610adc01528181610d08015281816110e10152818161142201528181611713015281816117ab015281816118540152611a4401526000818161022f015281816106c10152818161080e0152818161090d01528181610c2801528181610e3401528181610f330152818161120501528181611304015281816115ed015281816117dd0152818161196301528181611c330152611d9901526124ad6000f3fe608060405234801561001057600080fd5b50600436106102105760003560e01c8063720e586f11610125578063b187bd26116100ad578063ced72f871161007c578063ced72f8714610484578063d15786871461048c578063ebf77de014610494578063f2292f09146104a7578063fa26bb27146104b057600080fd5b8063b187bd261461042d578063bbb2fe7c14610438578063c5f0a58f1461044b578063cd564ccd1461045457600080fd5b80638db3c5fd116100f45780638db3c5fd146103c55780639ded51dd146103cd578063a3a336bf146103d5578063ac637c7a14610411578063ae39279f1461042457600080fd5b8063720e586f146103705780637494b323146103835780638456cb59146103965780638da5cb5b1461039e57600080fd5b80634a4e3bd5116101a8578063585450141161017757806358545014146103125780635c975abb1461032557806369fe0e2d146103425780636a1c6e78146103555780636abb3b4f1461035d57600080fd5b80634a4e3bd5146102dc5780634b0b1b8b146102e457806355bfc81c146102ec578063569d7111146102ff57600080fd5b8063358cbf0a116101e4578063358cbf0a146102995780633a8c3d6a146102a15780633f4ba83a146102b45780633ff5aecd146102bc57600080fd5b80620270a41461021557806311eac8551461022a57806321241dfe1461026e578063285298af14610286575b600080fd5b610228610223366004612002565b6104c3565b005b6102517f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610278624f1a0081565b604051908152602001610265565b610278610294366004612002565b6105b0565b6102286105da565b6102286102af36600461207e565b61078a565b610228610a30565b6102786102ca366004612002565b60066020526000908152604090205481565b610228610ad1565b610228610b72565b6102286102fa3660046120f9565b610cfd565b61022861030d366004612112565b610db0565b610228610320366004612002565b61104c565b6005546103329060ff1681565b6040519015158152602001610265565b6102286103503660046120f9565b6110d6565b610278600a81565b61022861036b36600461207e565b611181565b61022861037e366004612002565b611417565b6102286103913660046121b9565b611554565b610228611708565b6102517f000000000000000000000000000000000000000000000000000000000000000081565b610278605a81565b600154610278565b6103fc6103e3366004612002565b6002602052600090815260409020805460019091015482565b60408051928352602083019190915201610265565b61022861041f366004612002565b6118ee565b61027860005481565b60055460ff16610332565b610228610446366004612225565b611a39565b61027860015481565b610467610462366004612002565b611b55565b604080519384526020840192909252151590820152606001610265565b600054610278565b600354610278565b6102286104a2366004612002565b611ba2565b61027860035481565b6102286104be36600461224f565b611d00565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461050c57604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615610530576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b0381166105575760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03811660008181526006602052604080822091909155517fb6ddac613582447a8fcbbe869621560344bdbe26d6fea183b1e155cd223d864d906105a5906064815260200190565b60405180910390a250565b6001600160a01b0381166000908152600660205260408120546105d49060646122ff565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461062357604051635fc483c560e01b815260040160405180910390fd5b600454600103610646576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560035460000361066e5760405163493c1ab760e01b815260040160405180910390fd5b6003805460009182905560405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561070a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072e9190612312565b90508061074e576040516312171d8360e31b815260040160405180910390fd5b6040518281527f81521279371b94892737e5e06851c322303c72e5493db1453314ea08f55cb9379060200160405180910390a150506000600455565b6004546001036107ad576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff16156107d6576040516306d39fcd60e41b815260040160405180910390fd5b81156108c05760006107ea33600054611e9f565b905060008111801561088c57506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906108479033903090869060040161232f565b6020604051808303816000875af1158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a9190612312565b155b156108aa57604051634aa23e8f60e11b815260040160405180910390fd5b80156108ba576108ba8682611ee0565b506109c3565b60006108ce33600054611e9f565b9050600060646108df600a84612353565b6108e9919061236a565b905060008111801561098b57506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906109469033903090869060040161232f565b6020604051808303816000875af1158015610965573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109899190612312565b155b156109a957604051634aa23e8f60e11b815260040160405180910390fd5b80600360008282546109bb919061238c565b909155505050505b83836040516109d392919061239f565b6040805191829003822084151583528315156020840152916001600160a01b0388169133917f6c92a5c8a1b6c49076a075d1a499458f543fd2588ea971574373865f817ce83d91015b60405180910390a450506000600455505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a7957604051635fc483c560e01b815260040160405180910390fd5b60055460ff16610a9c5760405163dcdde9dd60e01b815260040160405180910390fd5b6005805460ff191690556040517f0e5e3b3fb504c22cf5c42fa07d521225937514c654007e1f12646f89768d6f9490600090a1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b1a57604051635fc483c560e01b815260040160405180910390fd5b60055460ff16610b3d5760405163dcdde9dd60e01b815260040160405180910390fd5b6005805460ff191690556040517f15de7ad89d29fd1c6d2e6b1e878453569b4080edf34e0105faaa3bd52f01853090600090a1565b600454600103610b95576040516345f5ce8b60e11b815260040160405180910390fd5b60016004553360009081526002602052604081208054909103610bcb5760405163493c1ab760e01b815260040160405180910390fd5b624f1a008160010154610bde919061238c565b421115610bfe5760405163493c1ab760e01b815260040160405180910390fd5b805460008083556001830181905560405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9d9190612312565b905080610cbd576040516312171d8360e31b815260040160405180910390fd5b60405182815233907f6673747791df7fe01578fcaebe4082d6d7680f052dbdd7d2cf345f88121be421906020015b60405180910390a25050600060045550565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d4657604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615610d6a576040516306d39fcd60e41b815260040160405180910390fd5b600180549082905560408051828152602081018490527f83b05743f1284b2faed08b3f927951e6663e5277e09a40c939f0dfe5075af77891015b60405180910390a15050565b600454600103610dd3576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615610dfc576040516306d39fcd60e41b815260040160405180910390fd5b8115610ee6576000610e1033600054611e9f565b9050600081118015610eb257506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610e6d9033903090869060040161232f565b6020604051808303816000875af1158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb09190612312565b155b15610ed057604051634aa23e8f60e11b815260040160405180910390fd5b8015610ee057610ee08882611ee0565b50610fe9565b6000610ef433600054611e9f565b905060006064610f05600a84612353565b610f0f919061236a565b9050600081118015610fb157506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610f6c9033903090869060040161232f565b6020604051808303816000875af1158015610f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610faf9190612312565b155b15610fcf57604051634aa23e8f60e11b815260040160405180910390fd5b8060036000828254610fe1919061238c565b909155505050505b866001600160a01b0316336001600160a01b03167f4576724219bca1c695ff280c4eba3f012c99252acd6c7d90c0407f63f8e6ad26888888888888604051611036969594939291906123d8565b60405180910390a3505060006004555050505050565b60045460010361106f576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615611098576040516306d39fcd60e41b815260040160405180910390fd5b6040516000906001600160a01b038316907f39e3ace752997a751bda5ecf126da84d0d23d5e61f3f56f26a6b22990d7beed8908390a3506000600455565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461111f57604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615611143576040516306d39fcd60e41b815260040160405180910390fd5b600080549082905560408051828152602081018490527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df613029101610da4565b6004546001036111a4576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff16156111cd576040516306d39fcd60e41b815260040160405180910390fd5b81156112b75760006111e133600054611e9f565b905060008111801561128357506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061123e9033903090869060040161232f565b6020604051808303816000875af115801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190612312565b155b156112a157604051634aa23e8f60e11b815260040160405180910390fd5b80156112b1576112b18682611ee0565b506113ba565b60006112c533600054611e9f565b9050600060646112d6600a84612353565b6112e0919061236a565b905060008111801561138257506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061133d9033903090869060040161232f565b6020604051808303816000875af115801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190612312565b155b156113a057604051634aa23e8f60e11b815260040160405180910390fd5b80600360008282546113b2919061238c565b909155505050505b83836040516113ca92919061239f565b6040805191829003822084151583528315156020840152916001600160a01b0388169133917f6a00347d56e88979c493ca2baa527a6cd1009b34431c4ef1021a5c0edd7856259101610a1c565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461146057604051635fc483c560e01b815260040160405180910390fd5b600454600103611483576040516345f5ce8b60e11b815260040160405180910390fd5b60016004556001600160a01b038116600090815260026020526040812080549091036114c25760405163493c1ab760e01b815260040160405180910390fd5b624f1a0081600101546114d5919061238c565b42116114f4576040516326f6703f60e11b815260040160405180910390fd5b80546000808355600183018190556003805483929061151490849061238c565b90915550506040518181526001600160a01b038416907fb4572b7f0782a4b7672a2341d00e4f1a0af99d81a3f8e959f25ff679eb31448190602001610ceb565b600454600103611577576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff16156115a0576040516306d39fcd60e41b815260040160405180910390fd5b60006115ae33600054611e9f565b9050600060646115bf600a84612353565b6115c9919061236a565b905060008111801561166b57506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906116269033903090869060040161232f565b6020604051808303816000875af1158015611645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116699190612312565b155b1561168957604051634aa23e8f60e11b815260040160405180910390fd5b806003600082825461169b919061238c565b90915550506040516116b0908590859061239f565b6040518091039020336001600160a01b03167ffadda1f12158473f0f6a95450c4108a36fc8aa62f3dee6a9de94c8c59947044388886040516116f392919061241a565b60405180910390a35050600060045550505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461175157604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615611775576040516306d39fcd60e41b815260040160405180910390fd5b6005805460ff19166001179055600354156118c3576003805460009182905560405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018390529192917f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611826573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184a9190612312565b905080156118ba577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd836040516118ad91815260200190565b60405180910390a26118c0565b60038290555b50505b6040517fab35696f06e428ebc5ceba8cd17f8fed287baf43440206d1943af1ee53e6d26790600090a1565b600454600103611911576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff161561193a576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b038116156119fb576001546040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9161199b91339130919060040161232f565b6020604051808303816000875af11580156119ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119de9190612312565b6119fb57604051634aa23e8f60e11b815260040160405180910390fd5b6040516001600160a01b0382169033907f39e3ace752997a751bda5ecf126da84d0d23d5e61f3f56f26a6b22990d7beed890600090a3506000600455565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611a8257604051635fc483c560e01b815260040160405180910390fd5b60055460ff1615611aa6576040516306d39fcd60e41b815260040160405180910390fd5b6001600160a01b038216611acd5760405163e6c4247b60e01b815260040160405180910390fd5b6064811115611aef57604051631f3b85d360e01b815260040160405180910390fd5b611afa8160646122ff565b6001600160a01b038316600081815260066020526040908190209290925590517fb6ddac613582447a8fcbbe869621560344bdbe26d6fea183b1e155cd223d864d90611b499084815260200190565b60405180910390a25050565b6001600160a01b0381166000908152600260205260408120805460018201549092918291611b8790624f1a009061238c565b815490935015801590611b9957508242115b93959294505050565b60055460ff16611bc55760405163dcdde9dd60e01b815260040160405180910390fd5b6001600160a01b03811660009081526002602052604081208054909103611bff5760405163493c1ab760e01b815260040160405180910390fd5b805460008083556001830181905560405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015611c7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca09190612312565b90508015611cf057836001600160a01b03167f26536799ace2c3dbe12e638ec3ade6b4173dcf1289be0a58d51a5003015649bd83604051611ce391815260200190565b60405180910390a2611cfa565b8183554260018401555b50505050565b600454600103611d23576040516345f5ce8b60e11b815260040160405180910390fd5b600160045560055460ff1615611d4c576040516306d39fcd60e41b815260040160405180910390fd5b6000611d5a33600054611e9f565b905060006064611d6b600a84612353565b611d75919061236a565b9050600081118015611e1757506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90611dd29033903090869060040161232f565b6020604051808303816000875af1158015611df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e159190612312565b155b15611e3557604051634aa23e8f60e11b815260040160405180910390fd5b8060036000828254611e47919061238c565b909155505060405133907fe137336c26280396075fb19ebe313eb4c539c2d845386ad035d8dee029bba31390611e88908b908b908b908b908b908b9061242e565b60405180910390a250506000600455505050505050565b6001600160a01b0382166000908152600660205260408120546064611ec482826122ff565b611ece9085612353565b611ed8919061236a565b949350505050565b611eed605a60001961236a565b811115611f0d57604051634eab2ea760e11b815260040160405180910390fd5b60006064611f1c600a84612353565b611f26919061236a565b90506000611f3482846122ff565b6001600160a01b038516600090815260026020526040812080549293508392909190611f6190849061238c565b90915550506001600160a01b03841660009081526002602052604081204260019091015560038054849290611f9790849061238c565b909155505060408051828152602081018490526001600160a01b038616917fad83ccf4aebaf9db0cc5658b24e378a4a865a51b863e0289e3ee0e4947d97b1c910160405180910390a250505050565b80356001600160a01b0381168114611ffd57600080fd5b919050565b60006020828403121561201457600080fd5b61201d82611fe6565b9392505050565b60008083601f84011261203657600080fd5b50813567ffffffffffffffff81111561204e57600080fd5b60208301915083602082850101111561206657600080fd5b9250929050565b801515811461207b57600080fd5b50565b60008060008060006080868803121561209657600080fd5b61209f86611fe6565b9450602086013567ffffffffffffffff8111156120bb57600080fd5b6120c788828901612024565b90955093505060408601356120db8161206d565b915060608601356120eb8161206d565b809150509295509295909350565b60006020828403121561210b57600080fd5b5035919050565b600080600080600080600060a0888a03121561212d57600080fd5b61213688611fe6565b9650602088013567ffffffffffffffff8082111561215357600080fd5b61215f8b838c01612024565b909850965060408a013591508082111561217857600080fd5b506121858a828b01612024565b90955093505060608801356121998161206d565b915060808801356121a98161206d565b8091505092959891949750929550565b600080600080604085870312156121cf57600080fd5b843567ffffffffffffffff808211156121e757600080fd5b6121f388838901612024565b9096509450602087013591508082111561220c57600080fd5b5061221987828801612024565b95989497509550505050565b6000806040838503121561223857600080fd5b61224183611fe6565b946020939093013593505050565b6000806000806000806060878903121561226857600080fd5b863567ffffffffffffffff8082111561228057600080fd5b61228c8a838b01612024565b909850965060208901359150808211156122a557600080fd5b6122b18a838b01612024565b909650945060408901359150808211156122ca57600080fd5b506122d789828a01612024565b979a9699509497509295939492505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105d4576105d46122e9565b60006020828403121561232457600080fd5b815161201d8161206d565b6001600160a01b039384168152919092166020820152604081019190915260600190565b80820281158282048414176105d4576105d46122e9565b60008261238757634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156105d4576105d46122e9565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6080815260006123ec60808301888a6123af565b82810360208401526123ff8187896123af565b94151560408401525050901515606090910152949350505050565b602081526000611ed86020830184866123af565b60608152600061244260608301888a6123af565b82810360208401526124558187896123af565b9050828103604084015261246a8185876123af565b999850505050505050505056fea2646970667358221220e1c37eda8c3c1cf54d351525c6b53f37f7736c919be2d1f2bf9a09fbbb29c2cb64736f6c63430008180033";
926
991
 
927
992
  type MailerConstructorParams =
928
993
  | [signer?: Signer]