chipi-stack 2.0.0__py3-none-any.whl

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.
chipi_sdk/sdk.py ADDED
@@ -0,0 +1,1021 @@
1
+ """Main Chipi SDK class for Starknet gasless transactions."""
2
+
3
+ from typing import Optional
4
+ from .models.core import ChipiSDKConfig, PaginatedResponse
5
+ from .models.wallet import (
6
+ CreateWalletParams,
7
+ CreateWalletResponse,
8
+ GetWalletParams,
9
+ GetWalletResponse,
10
+ GetTokenBalanceParams,
11
+ GetTokenBalanceResponse,
12
+ )
13
+ from .models.transaction import (
14
+ ExecuteTransactionParams,
15
+ TransferParams,
16
+ ApproveParams,
17
+ StakeVesuUsdcParams,
18
+ WithdrawVesuUsdcParams,
19
+ CallAnyContractParams,
20
+ RecordSendTransactionParams,
21
+ Transaction,
22
+ GetTransactionListQuery,
23
+ TransactionStatusResponse,
24
+ Call,
25
+ )
26
+ from .models.wallet import (
27
+ PrepareWalletUpgradeParams,
28
+ PrepareWalletUpgradeResponse,
29
+ ExecuteWalletUpgradeParams,
30
+ ExecuteWalletUpgradeResponse,
31
+ )
32
+ from .models.session import ExecuteWithSessionParams
33
+ from .models.sku import Sku, GetSkuListQuery
34
+ from .models.sku_transaction import CreateSkuTransactionParams, SkuTransaction
35
+ from .models.user import User, CreateUserParams, GetUserParams
36
+ from .client import ChipiClient
37
+ from .wallets import ChipiWallets
38
+ from .transactions import ChipiTransactions
39
+ from .sessions import ChipiSessions
40
+ from .skus import ChipiSkus
41
+ from .sku_transactions import ChipiSkuTransactions
42
+ from .users import ChipiUsers
43
+ from .formatters import format_amount
44
+ from .constants import STARKNET_NETWORKS, CONTRACT_ADDRESSES
45
+
46
+
47
+ class ChipiSDK:
48
+ """Main Chipi SDK class for Starknet gasless transactions."""
49
+
50
+ def __init__(self, config: ChipiSDKConfig):
51
+ """
52
+ Initialize the Chipi SDK.
53
+
54
+ Args:
55
+ config: SDK configuration with API keys and optional URLs
56
+ """
57
+ self.client = ChipiClient(config)
58
+ self.node_url = config.node_url or STARKNET_NETWORKS["MAINNET"]
59
+ self.api_secret_key = config.api_secret_key
60
+
61
+ # Initialize service managers
62
+ self.wallets = ChipiWallets(self.client)
63
+ self.transactions = ChipiTransactions(self.client)
64
+ self.sessions = ChipiSessions(self.client)
65
+ self.skus = ChipiSkus(self.client)
66
+ self.sku_transactions = ChipiSkuTransactions(self.client)
67
+ self.users = ChipiUsers(self.client)
68
+
69
+ def _resolve_bearer_token(self, bearer_token: Optional[str] = None) -> str:
70
+ """
71
+ Resolve bearer token - uses provided token or falls back to apiSecretKey.
72
+
73
+ Args:
74
+ bearer_token: Optional bearer token
75
+
76
+ Returns:
77
+ Resolved bearer token
78
+
79
+ Raises:
80
+ ValueError: If no token is available
81
+ """
82
+ token = bearer_token or self.api_secret_key
83
+
84
+ if not token:
85
+ raise ValueError(
86
+ "Authentication required: either pass a bearerToken or configure the SDK with an apiSecretKey"
87
+ )
88
+
89
+ return token
90
+
91
+ # ===== Transaction Methods =====
92
+
93
+ async def aexecute_transaction(
94
+ self,
95
+ params: ExecuteTransactionParams,
96
+ bearer_token: Optional[str] = None,
97
+ ) -> str:
98
+ """
99
+ Execute a gasless transaction (async).
100
+
101
+ Args:
102
+ params: Transaction execution parameters
103
+ bearer_token: Optional bearer token (falls back to SDK config)
104
+
105
+ Returns:
106
+ Transaction hash
107
+ """
108
+ return await self.transactions.aexecute_transaction(
109
+ params=params,
110
+ bearer_token=self._resolve_bearer_token(bearer_token),
111
+ )
112
+
113
+ def execute_transaction(
114
+ self,
115
+ params: ExecuteTransactionParams,
116
+ bearer_token: Optional[str] = None,
117
+ ) -> str:
118
+ """
119
+ Execute a gasless transaction (sync).
120
+
121
+ Args:
122
+ params: Transaction execution parameters
123
+ bearer_token: Optional bearer token
124
+
125
+ Returns:
126
+ Transaction hash
127
+ """
128
+ return self.transactions.execute_transaction(
129
+ params=params,
130
+ bearer_token=self._resolve_bearer_token(bearer_token),
131
+ )
132
+
133
+ async def aexecute_transaction_with_session(
134
+ self,
135
+ params: ExecuteWithSessionParams,
136
+ bearer_token: Optional[str] = None,
137
+ ) -> str:
138
+ """
139
+ Execute a gasless transaction using a session key (async).
140
+
141
+ CHIPI wallets only.
142
+
143
+ Args:
144
+ params: Session execution parameters
145
+ bearer_token: Optional bearer token
146
+
147
+ Returns:
148
+ Transaction hash
149
+ """
150
+ return await self.sessions.aexecute_transaction_with_session(
151
+ params=params,
152
+ bearer_token=self._resolve_bearer_token(bearer_token),
153
+ )
154
+
155
+ def execute_transaction_with_session(
156
+ self,
157
+ params: ExecuteWithSessionParams,
158
+ bearer_token: Optional[str] = None,
159
+ ) -> str:
160
+ """
161
+ Execute a gasless transaction using a session key (sync).
162
+
163
+ Args:
164
+ params: Session execution parameters
165
+ bearer_token: Optional bearer token
166
+
167
+ Returns:
168
+ Transaction hash
169
+ """
170
+ return self.sessions.execute_transaction_with_session(
171
+ params=params,
172
+ bearer_token=self._resolve_bearer_token(bearer_token),
173
+ )
174
+
175
+ async def atransfer(
176
+ self,
177
+ params: TransferParams,
178
+ bearer_token: Optional[str] = None,
179
+ ) -> str:
180
+ """
181
+ Transfer tokens (async).
182
+
183
+ Args:
184
+ params: Transfer parameters
185
+ bearer_token: Optional bearer token
186
+
187
+ Returns:
188
+ Transaction hash
189
+ """
190
+ return await self.transactions.atransfer(
191
+ params=params,
192
+ bearer_token=self._resolve_bearer_token(bearer_token),
193
+ )
194
+
195
+ def transfer(
196
+ self,
197
+ params: TransferParams,
198
+ bearer_token: Optional[str] = None,
199
+ ) -> str:
200
+ """
201
+ Transfer tokens (sync).
202
+
203
+ Args:
204
+ params: Transfer parameters
205
+ bearer_token: Optional bearer token
206
+
207
+ Returns:
208
+ Transaction hash
209
+ """
210
+ return self.transactions.transfer(
211
+ params=params,
212
+ bearer_token=self._resolve_bearer_token(bearer_token),
213
+ )
214
+
215
+ async def aapprove(
216
+ self,
217
+ params: ApproveParams,
218
+ bearer_token: Optional[str] = None,
219
+ ) -> str:
220
+ """
221
+ Approve token spending (async).
222
+
223
+ Args:
224
+ params: Approval parameters
225
+ bearer_token: Optional bearer token
226
+
227
+ Returns:
228
+ Transaction hash
229
+ """
230
+ return await self.transactions.aapprove(
231
+ params=params,
232
+ bearer_token=self._resolve_bearer_token(bearer_token),
233
+ )
234
+
235
+ def approve(
236
+ self,
237
+ params: ApproveParams,
238
+ bearer_token: Optional[str] = None,
239
+ ) -> str:
240
+ """
241
+ Approve token spending (sync).
242
+
243
+ Args:
244
+ params: Approval parameters
245
+ bearer_token: Optional bearer token
246
+
247
+ Returns:
248
+ Transaction hash
249
+ """
250
+ return self.transactions.approve(
251
+ params=params,
252
+ bearer_token=self._resolve_bearer_token(bearer_token),
253
+ )
254
+
255
+ async def astake_vesu_usdc(
256
+ self,
257
+ params: StakeVesuUsdcParams,
258
+ bearer_token: Optional[str] = None,
259
+ ) -> str:
260
+ """
261
+ Stake USDC in Vesu protocol (async).
262
+
263
+ Args:
264
+ params: Staking parameters
265
+ bearer_token: Optional bearer token
266
+
267
+ Returns:
268
+ Transaction hash
269
+ """
270
+ formatted_amount = format_amount(params.amount, 6)
271
+
272
+ return await self.aexecute_transaction(
273
+ params=ExecuteTransactionParams(
274
+ encrypt_key=params.encrypt_key,
275
+ wallet=params.wallet,
276
+ calls=[
277
+ Call(
278
+ contractAddress=CONTRACT_ADDRESSES["USDC_MAINNET"],
279
+ entrypoint="approve",
280
+ calldata=[
281
+ CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
282
+ formatted_amount,
283
+ "0x0",
284
+ ],
285
+ ),
286
+ Call(
287
+ contractAddress=CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
288
+ entrypoint="deposit",
289
+ calldata=[formatted_amount, "0x0", params.receiver_wallet],
290
+ ),
291
+ ],
292
+ ),
293
+ bearer_token=bearer_token,
294
+ )
295
+
296
+ def stake_vesu_usdc(
297
+ self,
298
+ params: StakeVesuUsdcParams,
299
+ bearer_token: Optional[str] = None,
300
+ ) -> str:
301
+ """
302
+ Stake USDC in Vesu protocol (sync).
303
+
304
+ Args:
305
+ params: Staking parameters
306
+ bearer_token: Optional bearer token
307
+
308
+ Returns:
309
+ Transaction hash
310
+ """
311
+ formatted_amount = format_amount(params.amount, 6)
312
+
313
+ return self.execute_transaction(
314
+ params=ExecuteTransactionParams(
315
+ encrypt_key=params.encrypt_key,
316
+ wallet=params.wallet,
317
+ calls=[
318
+ Call(
319
+ contractAddress=CONTRACT_ADDRESSES["USDC_MAINNET"],
320
+ entrypoint="approve",
321
+ calldata=[
322
+ CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
323
+ formatted_amount,
324
+ "0x0",
325
+ ],
326
+ ),
327
+ Call(
328
+ contractAddress=CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
329
+ entrypoint="deposit",
330
+ calldata=[formatted_amount, "0x0", params.receiver_wallet],
331
+ ),
332
+ ],
333
+ ),
334
+ bearer_token=bearer_token,
335
+ )
336
+
337
+ async def awithdraw_vesu_usdc(
338
+ self,
339
+ params: WithdrawVesuUsdcParams,
340
+ bearer_token: Optional[str] = None,
341
+ ) -> str:
342
+ """
343
+ Withdraw USDC from Vesu protocol (async).
344
+
345
+ Args:
346
+ params: Withdrawal parameters
347
+ bearer_token: Optional bearer token
348
+
349
+ Returns:
350
+ Transaction hash
351
+ """
352
+ formatted_amount = format_amount(params.amount, 6)
353
+
354
+ return await self.aexecute_transaction(
355
+ params=ExecuteTransactionParams(
356
+ encrypt_key=params.encrypt_key,
357
+ wallet=params.wallet,
358
+ calls=[
359
+ Call(
360
+ contractAddress=CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
361
+ entrypoint="withdraw",
362
+ calldata=[formatted_amount, params.recipient, "0x0"],
363
+ )
364
+ ],
365
+ ),
366
+ bearer_token=bearer_token,
367
+ )
368
+
369
+ def withdraw_vesu_usdc(
370
+ self,
371
+ params: WithdrawVesuUsdcParams,
372
+ bearer_token: Optional[str] = None,
373
+ ) -> str:
374
+ """
375
+ Withdraw USDC from Vesu protocol (sync).
376
+
377
+ Args:
378
+ params: Withdrawal parameters
379
+ bearer_token: Optional bearer token
380
+
381
+ Returns:
382
+ Transaction hash
383
+ """
384
+ formatted_amount = format_amount(params.amount, 6)
385
+
386
+ return self.execute_transaction(
387
+ params=ExecuteTransactionParams(
388
+ encrypt_key=params.encrypt_key,
389
+ wallet=params.wallet,
390
+ calls=[
391
+ Call(
392
+ contractAddress=CONTRACT_ADDRESSES["VESU_USDC_MAINNET"],
393
+ entrypoint="withdraw",
394
+ calldata=[formatted_amount, params.recipient, "0x0"],
395
+ )
396
+ ],
397
+ ),
398
+ bearer_token=bearer_token,
399
+ )
400
+
401
+ async def acall_any_contract(
402
+ self,
403
+ params: CallAnyContractParams,
404
+ bearer_token: Optional[str] = None,
405
+ ) -> str:
406
+ """
407
+ Call any contract method (async).
408
+
409
+ Args:
410
+ params: Contract call parameters
411
+ bearer_token: Optional bearer token
412
+
413
+ Returns:
414
+ Transaction hash
415
+ """
416
+ return await self.aexecute_transaction(
417
+ params=ExecuteTransactionParams(
418
+ encrypt_key=params.encrypt_key,
419
+ wallet=params.wallet,
420
+ calls=params.calls,
421
+ use_passkey=params.use_passkey,
422
+ ),
423
+ bearer_token=bearer_token,
424
+ )
425
+
426
+ def call_any_contract(
427
+ self,
428
+ params: CallAnyContractParams,
429
+ bearer_token: Optional[str] = None,
430
+ ) -> str:
431
+ """
432
+ Call any contract method (sync).
433
+
434
+ Args:
435
+ params: Contract call parameters
436
+ bearer_token: Optional bearer token
437
+
438
+ Returns:
439
+ Transaction hash
440
+ """
441
+ return self.execute_transaction(
442
+ params=ExecuteTransactionParams(
443
+ encrypt_key=params.encrypt_key,
444
+ wallet=params.wallet,
445
+ calls=params.calls,
446
+ use_passkey=params.use_passkey,
447
+ ),
448
+ bearer_token=bearer_token,
449
+ )
450
+
451
+ # ===== Wallet Methods =====
452
+
453
+ async def acreate_wallet(
454
+ self,
455
+ params: CreateWalletParams,
456
+ bearer_token: Optional[str] = None,
457
+ ) -> CreateWalletResponse:
458
+ """
459
+ Create a new wallet (async).
460
+
461
+ Args:
462
+ params: Wallet creation parameters
463
+ bearer_token: Optional bearer token
464
+
465
+ Returns:
466
+ Wallet creation response
467
+ """
468
+ return await self.wallets.acreate_wallet(
469
+ params=params,
470
+ bearer_token=self._resolve_bearer_token(bearer_token),
471
+ )
472
+
473
+ def create_wallet(
474
+ self,
475
+ params: CreateWalletParams,
476
+ bearer_token: Optional[str] = None,
477
+ ) -> CreateWalletResponse:
478
+ """
479
+ Create a new wallet (sync).
480
+
481
+ Args:
482
+ params: Wallet creation parameters
483
+ bearer_token: Optional bearer token
484
+
485
+ Returns:
486
+ Wallet creation response
487
+ """
488
+ return self.wallets.create_wallet(
489
+ params=params,
490
+ bearer_token=self._resolve_bearer_token(bearer_token),
491
+ )
492
+
493
+ async def aget_wallet(
494
+ self,
495
+ params: GetWalletParams,
496
+ bearer_token: Optional[str] = None,
497
+ ) -> Optional[GetWalletResponse]:
498
+ """
499
+ Get wallet by external user ID (async).
500
+
501
+ Args:
502
+ params: Wallet query parameters
503
+ bearer_token: Optional bearer token
504
+
505
+ Returns:
506
+ Wallet data or None if not found
507
+ """
508
+ return await self.wallets.aget_wallet(
509
+ params=params,
510
+ bearer_token=self._resolve_bearer_token(bearer_token),
511
+ )
512
+
513
+ def get_wallet(
514
+ self,
515
+ params: GetWalletParams,
516
+ bearer_token: Optional[str] = None,
517
+ ) -> Optional[GetWalletResponse]:
518
+ """
519
+ Get wallet by external user ID (sync).
520
+
521
+ Args:
522
+ params: Wallet query parameters
523
+ bearer_token: Optional bearer token
524
+
525
+ Returns:
526
+ Wallet data or None if not found
527
+ """
528
+ return self.wallets.get_wallet(
529
+ params=params,
530
+ bearer_token=self._resolve_bearer_token(bearer_token),
531
+ )
532
+
533
+ async def aget_token_balance(
534
+ self,
535
+ params: GetTokenBalanceParams,
536
+ bearer_token: Optional[str] = None,
537
+ ) -> GetTokenBalanceResponse:
538
+ """
539
+ Get token balance (async).
540
+
541
+ Args:
542
+ params: Balance query parameters
543
+ bearer_token: Optional bearer token
544
+
545
+ Returns:
546
+ Token balance
547
+ """
548
+ return await self.wallets.aget_token_balance(
549
+ params=params,
550
+ bearer_token=self._resolve_bearer_token(bearer_token),
551
+ )
552
+
553
+ def get_token_balance(
554
+ self,
555
+ params: GetTokenBalanceParams,
556
+ bearer_token: Optional[str] = None,
557
+ ) -> GetTokenBalanceResponse:
558
+ """
559
+ Get token balance (sync).
560
+
561
+ Args:
562
+ params: Balance query parameters
563
+ bearer_token: Optional bearer token
564
+
565
+ Returns:
566
+ Token balance
567
+ """
568
+ return self.wallets.get_token_balance(
569
+ params=params,
570
+ bearer_token=self._resolve_bearer_token(bearer_token),
571
+ )
572
+
573
+ # ===== Transaction History =====
574
+
575
+ async def arecord_send_transaction(
576
+ self,
577
+ params: RecordSendTransactionParams,
578
+ bearer_token: Optional[str] = None,
579
+ ) -> Transaction:
580
+ """
581
+ Record a send transaction (async).
582
+
583
+ Args:
584
+ params: Transaction recording parameters
585
+ bearer_token: Optional bearer token
586
+
587
+ Returns:
588
+ Transaction record
589
+ """
590
+ return await self.transactions.arecord_send_transaction(
591
+ params=params,
592
+ bearer_token=self._resolve_bearer_token(bearer_token),
593
+ )
594
+
595
+ def record_send_transaction(
596
+ self,
597
+ params: RecordSendTransactionParams,
598
+ bearer_token: Optional[str] = None,
599
+ ) -> Transaction:
600
+ """
601
+ Record a send transaction (sync).
602
+
603
+ Args:
604
+ params: Transaction recording parameters
605
+ bearer_token: Optional bearer token
606
+
607
+ Returns:
608
+ Transaction record
609
+ """
610
+ return self.transactions.record_send_transaction(
611
+ params=params,
612
+ bearer_token=self._resolve_bearer_token(bearer_token),
613
+ )
614
+
615
+ async def aget_transaction_list(
616
+ self,
617
+ query: GetTransactionListQuery,
618
+ bearer_token: Optional[str] = None,
619
+ ) -> PaginatedResponse[Transaction]:
620
+ """
621
+ Get transaction list (async).
622
+
623
+ Args:
624
+ query: Query parameters
625
+ bearer_token: Optional bearer token
626
+
627
+ Returns:
628
+ Paginated transaction list
629
+ """
630
+ return await self.transactions.aget_transaction_list(
631
+ query=query,
632
+ bearer_token=self._resolve_bearer_token(bearer_token),
633
+ )
634
+
635
+ def get_transaction_list(
636
+ self,
637
+ query: GetTransactionListQuery,
638
+ bearer_token: Optional[str] = None,
639
+ ) -> PaginatedResponse[Transaction]:
640
+ """
641
+ Get transaction list (sync).
642
+
643
+ Args:
644
+ query: Query parameters
645
+ bearer_token: Optional bearer token
646
+
647
+ Returns:
648
+ Paginated transaction list
649
+ """
650
+ return self.transactions.get_transaction_list(
651
+ query=query,
652
+ bearer_token=self._resolve_bearer_token(bearer_token),
653
+ )
654
+
655
+ # ===== Single Transaction Lookup =====
656
+
657
+ async def aget_transaction(
658
+ self,
659
+ hash_or_id: str,
660
+ bearer_token: Optional[str] = None,
661
+ ) -> Transaction:
662
+ """
663
+ Get a single transaction by hash or ID (async).
664
+
665
+ Args:
666
+ hash_or_id: Transaction hash (0x...) or internal database ID
667
+ bearer_token: Optional bearer token
668
+
669
+ Returns:
670
+ Transaction record
671
+ """
672
+ return await self.transactions.aget_transaction(
673
+ hash_or_id=hash_or_id,
674
+ bearer_token=self._resolve_bearer_token(bearer_token),
675
+ )
676
+
677
+ def get_transaction(
678
+ self,
679
+ hash_or_id: str,
680
+ bearer_token: Optional[str] = None,
681
+ ) -> Transaction:
682
+ """
683
+ Get a single transaction by hash or ID (sync).
684
+
685
+ Args:
686
+ hash_or_id: Transaction hash (0x...) or internal database ID
687
+ bearer_token: Optional bearer token
688
+
689
+ Returns:
690
+ Transaction record
691
+ """
692
+ return self.transactions.get_transaction(
693
+ hash_or_id=hash_or_id,
694
+ bearer_token=self._resolve_bearer_token(bearer_token),
695
+ )
696
+
697
+ async def aget_transaction_status(
698
+ self,
699
+ hash: str,
700
+ bearer_token: Optional[str] = None,
701
+ ) -> TransactionStatusResponse:
702
+ """
703
+ Get on-chain transaction status (async).
704
+
705
+ Args:
706
+ hash: Transaction hash (0x...)
707
+ bearer_token: Optional bearer token
708
+
709
+ Returns:
710
+ Transaction status response
711
+ """
712
+ return await self.transactions.aget_transaction_status(
713
+ hash=hash,
714
+ bearer_token=self._resolve_bearer_token(bearer_token),
715
+ )
716
+
717
+ def get_transaction_status(
718
+ self,
719
+ hash: str,
720
+ bearer_token: Optional[str] = None,
721
+ ) -> TransactionStatusResponse:
722
+ """
723
+ Get on-chain transaction status (sync).
724
+
725
+ Args:
726
+ hash: Transaction hash (0x...)
727
+ bearer_token: Optional bearer token
728
+
729
+ Returns:
730
+ Transaction status response
731
+ """
732
+ return self.transactions.get_transaction_status(
733
+ hash=hash,
734
+ bearer_token=self._resolve_bearer_token(bearer_token),
735
+ )
736
+
737
+ # ===== Wallet Upgrade Methods =====
738
+
739
+ async def aprepare_wallet_upgrade(
740
+ self,
741
+ params: PrepareWalletUpgradeParams,
742
+ bearer_token: Optional[str] = None,
743
+ ) -> PrepareWalletUpgradeResponse:
744
+ """
745
+ Prepare a wallet upgrade (async).
746
+
747
+ Args:
748
+ params: Upgrade preparation parameters
749
+ bearer_token: Optional bearer token
750
+
751
+ Returns:
752
+ Typed data to sign for the upgrade
753
+ """
754
+ return await self.wallets.aprepare_wallet_upgrade(
755
+ params=params,
756
+ bearer_token=self._resolve_bearer_token(bearer_token),
757
+ )
758
+
759
+ def prepare_wallet_upgrade(
760
+ self,
761
+ params: PrepareWalletUpgradeParams,
762
+ bearer_token: Optional[str] = None,
763
+ ) -> PrepareWalletUpgradeResponse:
764
+ """
765
+ Prepare a wallet upgrade (sync).
766
+
767
+ Args:
768
+ params: Upgrade preparation parameters
769
+ bearer_token: Optional bearer token
770
+
771
+ Returns:
772
+ Typed data to sign for the upgrade
773
+ """
774
+ return self.wallets.prepare_wallet_upgrade(
775
+ params=params,
776
+ bearer_token=self._resolve_bearer_token(bearer_token),
777
+ )
778
+
779
+ async def aexecute_wallet_upgrade(
780
+ self,
781
+ params: ExecuteWalletUpgradeParams,
782
+ bearer_token: Optional[str] = None,
783
+ ) -> ExecuteWalletUpgradeResponse:
784
+ """
785
+ Execute a wallet upgrade after signing (async).
786
+
787
+ Args:
788
+ params: Upgrade execution parameters
789
+ bearer_token: Optional bearer token
790
+
791
+ Returns:
792
+ Upgrade result with transaction hash
793
+ """
794
+ return await self.wallets.aexecute_wallet_upgrade(
795
+ params=params,
796
+ bearer_token=self._resolve_bearer_token(bearer_token),
797
+ )
798
+
799
+ def execute_wallet_upgrade(
800
+ self,
801
+ params: ExecuteWalletUpgradeParams,
802
+ bearer_token: Optional[str] = None,
803
+ ) -> ExecuteWalletUpgradeResponse:
804
+ """
805
+ Execute a wallet upgrade after signing (sync).
806
+
807
+ Args:
808
+ params: Upgrade execution parameters
809
+ bearer_token: Optional bearer token
810
+
811
+ Returns:
812
+ Upgrade result with transaction hash
813
+ """
814
+ return self.wallets.execute_wallet_upgrade(
815
+ params=params,
816
+ bearer_token=self._resolve_bearer_token(bearer_token),
817
+ )
818
+
819
+ # ===== SKU Methods =====
820
+
821
+ async def aget_sku_list(
822
+ self,
823
+ params: GetSkuListQuery,
824
+ bearer_token: Optional[str] = None,
825
+ ) -> PaginatedResponse[Sku]:
826
+ """
827
+ Get SKU list (async).
828
+
829
+ Args:
830
+ params: Query parameters
831
+ bearer_token: Optional bearer token
832
+
833
+ Returns:
834
+ Paginated SKU list
835
+ """
836
+ return await self.skus.aget_sku_list(
837
+ params=params,
838
+ bearer_token=self._resolve_bearer_token(bearer_token),
839
+ )
840
+
841
+ def get_sku_list(
842
+ self,
843
+ params: GetSkuListQuery,
844
+ bearer_token: Optional[str] = None,
845
+ ) -> PaginatedResponse[Sku]:
846
+ """
847
+ Get SKU list (sync).
848
+
849
+ Args:
850
+ params: Query parameters
851
+ bearer_token: Optional bearer token
852
+
853
+ Returns:
854
+ Paginated SKU list
855
+ """
856
+ return self.skus.get_sku_list(
857
+ params=params,
858
+ bearer_token=self._resolve_bearer_token(bearer_token),
859
+ )
860
+
861
+ async def aget_sku(
862
+ self,
863
+ sku_id: str,
864
+ bearer_token: Optional[str] = None,
865
+ ) -> Sku:
866
+ """
867
+ Get SKU by ID (async).
868
+
869
+ Args:
870
+ sku_id: SKU identifier
871
+ bearer_token: Optional bearer token
872
+
873
+ Returns:
874
+ SKU data
875
+ """
876
+ return await self.skus.aget_sku(
877
+ sku_id=sku_id,
878
+ bearer_token=self._resolve_bearer_token(bearer_token),
879
+ )
880
+
881
+ def get_sku(
882
+ self,
883
+ sku_id: str,
884
+ bearer_token: Optional[str] = None,
885
+ ) -> Sku:
886
+ """
887
+ Get SKU by ID (sync).
888
+
889
+ Args:
890
+ sku_id: SKU identifier
891
+ bearer_token: Optional bearer token
892
+
893
+ Returns:
894
+ SKU data
895
+ """
896
+ return self.skus.get_sku(
897
+ sku_id=sku_id,
898
+ bearer_token=self._resolve_bearer_token(bearer_token),
899
+ )
900
+
901
+ async def acreate_sku_transaction(
902
+ self,
903
+ params: CreateSkuTransactionParams,
904
+ bearer_token: Optional[str] = None,
905
+ ) -> SkuTransaction:
906
+ """
907
+ Create SKU transaction (async).
908
+
909
+ Args:
910
+ params: SKU transaction parameters
911
+ bearer_token: Optional bearer token
912
+
913
+ Returns:
914
+ SKU transaction
915
+ """
916
+ return await self.sku_transactions.acreate_sku_transaction(
917
+ params=params,
918
+ bearer_token=self._resolve_bearer_token(bearer_token),
919
+ )
920
+
921
+ def create_sku_transaction(
922
+ self,
923
+ params: CreateSkuTransactionParams,
924
+ bearer_token: Optional[str] = None,
925
+ ) -> SkuTransaction:
926
+ """
927
+ Create SKU transaction (sync).
928
+
929
+ Args:
930
+ params: SKU transaction parameters
931
+ bearer_token: Optional bearer token
932
+
933
+ Returns:
934
+ SKU transaction
935
+ """
936
+ return self.sku_transactions.create_sku_transaction(
937
+ params=params,
938
+ bearer_token=self._resolve_bearer_token(bearer_token),
939
+ )
940
+
941
+ # ===== User Methods =====
942
+
943
+ async def aget_user(
944
+ self,
945
+ params: GetUserParams,
946
+ bearer_token: Optional[str] = None,
947
+ ) -> User:
948
+ """
949
+ Get user by external ID (async).
950
+
951
+ Args:
952
+ params: User query parameters
953
+ bearer_token: Optional bearer token
954
+
955
+ Returns:
956
+ User data
957
+ """
958
+ return await self.users.aget_user(
959
+ params=params,
960
+ bearer_token=self._resolve_bearer_token(bearer_token),
961
+ )
962
+
963
+ def get_user(
964
+ self,
965
+ params: GetUserParams,
966
+ bearer_token: Optional[str] = None,
967
+ ) -> User:
968
+ """
969
+ Get user by external ID (sync).
970
+
971
+ Args:
972
+ params: User query parameters
973
+ bearer_token: Optional bearer token
974
+
975
+ Returns:
976
+ User data
977
+ """
978
+ return self.users.get_user(
979
+ params=params,
980
+ bearer_token=self._resolve_bearer_token(bearer_token),
981
+ )
982
+
983
+ async def acreate_user(
984
+ self,
985
+ params: CreateUserParams,
986
+ bearer_token: Optional[str] = None,
987
+ ) -> User:
988
+ """
989
+ Create user (async).
990
+
991
+ Args:
992
+ params: User creation parameters
993
+ bearer_token: Optional bearer token
994
+
995
+ Returns:
996
+ Created user
997
+ """
998
+ return await self.users.acreate_user(
999
+ params=params,
1000
+ bearer_token=self._resolve_bearer_token(bearer_token),
1001
+ )
1002
+
1003
+ def create_user(
1004
+ self,
1005
+ params: CreateUserParams,
1006
+ bearer_token: Optional[str] = None,
1007
+ ) -> User:
1008
+ """
1009
+ Create user (sync).
1010
+
1011
+ Args:
1012
+ params: User creation parameters
1013
+ bearer_token: Optional bearer token
1014
+
1015
+ Returns:
1016
+ Created user
1017
+ """
1018
+ return self.users.create_user(
1019
+ params=params,
1020
+ bearer_token=self._resolve_bearer_token(bearer_token),
1021
+ )