uvd-x402-sdk 0.2.3__tar.gz → 0.3.1__tar.gz

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 (29) hide show
  1. {uvd_x402_sdk-0.2.3/src/uvd_x402_sdk.egg-info → uvd_x402_sdk-0.3.1}/PKG-INFO +120 -8
  2. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/README.md +117 -5
  3. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/pyproject.toml +7 -2
  4. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/__init__.py +17 -1
  5. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/__init__.py +24 -0
  6. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/base.py +150 -1
  7. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/evm.py +115 -6
  8. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1/src/uvd_x402_sdk.egg-info}/PKG-INFO +120 -8
  9. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/LICENSE +0 -0
  10. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/setup.cfg +0 -0
  11. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/client.py +0 -0
  12. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/config.py +0 -0
  13. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/decorators.py +0 -0
  14. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/exceptions.py +0 -0
  15. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/integrations/__init__.py +0 -0
  16. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/integrations/django_integration.py +0 -0
  17. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/integrations/fastapi_integration.py +0 -0
  18. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/integrations/flask_integration.py +0 -0
  19. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/integrations/lambda_integration.py +0 -0
  20. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/models.py +0 -0
  21. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/near.py +0 -0
  22. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/solana.py +0 -0
  23. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/networks/stellar.py +0 -0
  24. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk/response.py +0 -0
  25. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk.egg-info/SOURCES.txt +0 -0
  26. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk.egg-info/dependency_links.txt +0 -0
  27. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk.egg-info/requires.txt +0 -0
  28. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/src/uvd_x402_sdk.egg-info/top_level.txt +0 -0
  29. {uvd_x402_sdk-0.2.3 → uvd_x402_sdk-0.3.1}/tests/test_client.py +0 -0
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uvd-x402-sdk
3
- Version: 0.2.3
4
- Summary: Python SDK for integrating x402 payments via the Ultravioleta DAO facilitator
3
+ Version: 0.3.1
4
+ Summary: Python SDK for x402 payments - gasless crypto payments across 14 blockchains with multi-stablecoin support (USDC, EURC, AUSD, PYUSD)
5
5
  Author-email: Ultravioleta DAO <dev@ultravioletadao.xyz>
6
6
  Project-URL: Homepage, https://github.com/UltravioletaDAO/uvd-x402-sdk-python
7
7
  Project-URL: Documentation, https://docs.ultravioletadao.xyz/x402-sdk
8
8
  Project-URL: Repository, https://github.com/UltravioletaDAO/uvd-x402-sdk-python
9
9
  Project-URL: Issues, https://github.com/UltravioletaDAO/uvd-x402-sdk-python/issues
10
- Keywords: x402,payments,crypto,usdc,web3,evm,solana,near,stellar,facilitator
10
+ Keywords: x402,payments,crypto,usdc,eurc,stablecoin,web3,evm,solana,near,stellar,facilitator,gasless,eip-712,eip-3009
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
@@ -51,17 +51,18 @@ Requires-Dist: httpx>=0.24.0; extra == "dev"
51
51
 
52
52
  Python SDK for integrating **x402 cryptocurrency payments** via the Ultravioleta DAO facilitator.
53
53
 
54
- Accept USDC payments across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
54
+ Accept **gasless stablecoin payments** across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
55
55
 
56
56
  ## Features
57
57
 
58
58
  - **14 Networks**: EVM chains (Base, Ethereum, Polygon, etc.), SVM chains (Solana, Fogo), NEAR, and Stellar
59
+ - **4 Stablecoins**: USDC, EURC, AUSD, PYUSD (EVM chains)
59
60
  - **x402 v1 & v2**: Full support for both protocol versions with auto-detection
60
61
  - **Framework Integrations**: Flask, FastAPI, Django, AWS Lambda
61
- - **Gasless Payments**: Users sign authorizations, facilitator pays all network fees
62
+ - **Gasless Payments**: Users sign EIP-712/EIP-3009 authorizations, facilitator pays all network fees
62
63
  - **Simple API**: Decorators and middleware for quick integration
63
64
  - **Type Safety**: Full Pydantic models and type hints
64
- - **Extensible**: Register custom networks easily
65
+ - **Extensible**: Register custom networks and tokens easily
65
66
 
66
67
  ## Quick Start (5 Lines)
67
68
 
@@ -93,6 +94,15 @@ print(f"Paid by {result.payer_address}, tx: {result.transaction_hash}")
93
94
  | NEAR | NEAR | - | `near:mainnet` | Active |
94
95
  | Stellar | Stellar | - | `stellar:pubnet` | Active |
95
96
 
97
+ ### Supported Tokens (EVM Chains)
98
+
99
+ | Token | Networks | Decimals |
100
+ |-------|----------|----------|
101
+ | USDC | All EVM chains | 6 |
102
+ | EURC | Ethereum, Base, Avalanche | 6 |
103
+ | AUSD | Ethereum, Arbitrum, Avalanche, Polygon, Monad | 6 |
104
+ | PYUSD | Ethereum | 6 |
105
+
96
106
  ## Installation
97
107
 
98
108
  ```bash
@@ -610,6 +620,90 @@ config = X402Config(
610
620
 
611
621
  ---
612
622
 
623
+ ## Multi-Token Support
624
+
625
+ The SDK supports 6 stablecoins on EVM chains. Use the token helper functions to query and work with different tokens.
626
+
627
+ ### Querying Token Support
628
+
629
+ ```python
630
+ from uvd_x402_sdk import (
631
+ TokenType,
632
+ get_token_config,
633
+ get_supported_tokens,
634
+ is_token_supported,
635
+ get_networks_by_token,
636
+ )
637
+
638
+ # Check which tokens a network supports
639
+ tokens = get_supported_tokens("ethereum")
640
+ print(tokens) # ['usdc', 'eurc', 'ausd', 'pyusd']
641
+
642
+ tokens = get_supported_tokens("base")
643
+ print(tokens) # ['usdc', 'eurc']
644
+
645
+ # Check if a specific token is supported
646
+ if is_token_supported("ethereum", "eurc"):
647
+ print("EURC is available on Ethereum!")
648
+
649
+ # Get token configuration
650
+ config = get_token_config("ethereum", "eurc")
651
+ if config:
652
+ print(f"EURC address: {config.address}")
653
+ print(f"Decimals: {config.decimals}")
654
+ print(f"EIP-712 name: {config.name}")
655
+ print(f"EIP-712 version: {config.version}")
656
+
657
+ # Find all networks that support a token
658
+ networks = get_networks_by_token("eurc")
659
+ for network in networks:
660
+ print(f"EURC available on: {network.display_name}")
661
+ # Output: EURC available on: Ethereum, Base, Avalanche C-Chain
662
+ ```
663
+
664
+ ### Token Configuration
665
+
666
+ Each token has specific EIP-712 domain parameters required for signing:
667
+
668
+ ```python
669
+ from uvd_x402_sdk import TokenConfig, get_token_config
670
+
671
+ # TokenConfig structure
672
+ # - address: Contract address
673
+ # - decimals: Token decimals (6 for all supported stablecoins)
674
+ # - name: EIP-712 domain name (e.g., "USD Coin", "EURC", "Gho Token")
675
+ # - version: EIP-712 domain version
676
+
677
+ # Example: Get EURC config on Base
678
+ eurc = get_token_config("base", "eurc")
679
+ # TokenConfig(
680
+ # address="0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42",
681
+ # decimals=6,
682
+ # name="EURC",
683
+ # version="2"
684
+ # )
685
+
686
+ # Example: Get PYUSD config on Ethereum
687
+ pyusd = get_token_config("ethereum", "pyusd")
688
+ # TokenConfig(
689
+ # address="0x6c3ea9036406852006290770BEdFcAbA0e23A0e8",
690
+ # decimals=6,
691
+ # name="PayPal USD",
692
+ # version="1"
693
+ # )
694
+ ```
695
+
696
+ ### Available Tokens
697
+
698
+ | Token | Description | Decimals | Issuer |
699
+ |-------|-------------|----------|--------|
700
+ | `usdc` | USD Coin | 6 | Circle |
701
+ | `eurc` | Euro Coin | 6 | Circle |
702
+ | `ausd` | Agora USD | 6 | Agora Finance |
703
+ | `pyusd` | PayPal USD | 6 | PayPal/Paxos |
704
+
705
+ ---
706
+
613
707
  ## Error Handling
614
708
 
615
709
  ```python
@@ -655,7 +749,7 @@ except X402Error as e:
655
749
 
656
750
  ## How x402 Works
657
751
 
658
- The x402 protocol enables gasless USDC payments:
752
+ The x402 protocol enables gasless stablecoin payments (USDC, EURC, AUSD, PYUSD):
659
753
 
660
754
  ```
661
755
  1. User Request --> Client sends request without payment
@@ -698,13 +792,14 @@ The facilitator (https://facilitator.ultravioletadao.xyz) handles all on-chain i
698
792
  ## Security
699
793
 
700
794
  - Users **NEVER** pay gas or submit transactions directly
701
- - **EVM**: Users sign EIP-712 structured messages only (no transaction broadcast)
795
+ - **EVM**: Users sign EIP-712 structured messages for any supported stablecoin (USDC, EURC, AUSD, PYUSD)
702
796
  - **Solana/Fogo**: Users sign partial transactions (facilitator co-signs and submits)
703
797
  - **Stellar**: Users sign Soroban authorization entries only
704
798
  - **NEAR**: Users sign NEP-366 meta-transactions (DelegateAction)
705
799
  - The facilitator submits and pays for all on-chain transactions
706
800
  - All signatures include expiration timestamps (`validBefore`) for replay protection
707
801
  - Nonces prevent double-spending of authorizations
802
+ - Each token has verified contract addresses and EIP-712 domain parameters
708
803
 
709
804
  ---
710
805
 
@@ -782,6 +877,23 @@ MIT License - see LICENSE file.
782
877
 
783
878
  ## Changelog
784
879
 
880
+ ### v0.3.1 (2025-12-21)
881
+
882
+ - Removed GHO and crvUSD token support (not EIP-3009 compatible)
883
+ - SDK now supports 4 stablecoins: USDC, EURC, AUSD, PYUSD
884
+
885
+ ### v0.3.0 (2025-12-20)
886
+
887
+ - **Multi-Stablecoin Support**: Added support for 4 stablecoins on EVM chains
888
+ - USDC (all EVM chains)
889
+ - EURC (Ethereum, Base, Avalanche)
890
+ - AUSD (Ethereum, Arbitrum, Avalanche, Polygon, Monad)
891
+ - PYUSD (Ethereum)
892
+ - Added `TokenType` literal type and `TokenConfig` dataclass
893
+ - Added token helper functions: `get_token_config()`, `get_supported_tokens()`, `is_token_supported()`, `get_networks_by_token()`
894
+ - Added `tokens` field to `NetworkConfig` for multi-token configurations
895
+ - Updated EVM network configurations with token contract addresses and EIP-712 domain parameters
896
+
785
897
  ### v0.2.2 (2025-12-16)
786
898
 
787
899
  - Added Security section to documentation
@@ -2,17 +2,18 @@
2
2
 
3
3
  Python SDK for integrating **x402 cryptocurrency payments** via the Ultravioleta DAO facilitator.
4
4
 
5
- Accept USDC payments across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
5
+ Accept **gasless stablecoin payments** across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
6
6
 
7
7
  ## Features
8
8
 
9
9
  - **14 Networks**: EVM chains (Base, Ethereum, Polygon, etc.), SVM chains (Solana, Fogo), NEAR, and Stellar
10
+ - **4 Stablecoins**: USDC, EURC, AUSD, PYUSD (EVM chains)
10
11
  - **x402 v1 & v2**: Full support for both protocol versions with auto-detection
11
12
  - **Framework Integrations**: Flask, FastAPI, Django, AWS Lambda
12
- - **Gasless Payments**: Users sign authorizations, facilitator pays all network fees
13
+ - **Gasless Payments**: Users sign EIP-712/EIP-3009 authorizations, facilitator pays all network fees
13
14
  - **Simple API**: Decorators and middleware for quick integration
14
15
  - **Type Safety**: Full Pydantic models and type hints
15
- - **Extensible**: Register custom networks easily
16
+ - **Extensible**: Register custom networks and tokens easily
16
17
 
17
18
  ## Quick Start (5 Lines)
18
19
 
@@ -44,6 +45,15 @@ print(f"Paid by {result.payer_address}, tx: {result.transaction_hash}")
44
45
  | NEAR | NEAR | - | `near:mainnet` | Active |
45
46
  | Stellar | Stellar | - | `stellar:pubnet` | Active |
46
47
 
48
+ ### Supported Tokens (EVM Chains)
49
+
50
+ | Token | Networks | Decimals |
51
+ |-------|----------|----------|
52
+ | USDC | All EVM chains | 6 |
53
+ | EURC | Ethereum, Base, Avalanche | 6 |
54
+ | AUSD | Ethereum, Arbitrum, Avalanche, Polygon, Monad | 6 |
55
+ | PYUSD | Ethereum | 6 |
56
+
47
57
  ## Installation
48
58
 
49
59
  ```bash
@@ -561,6 +571,90 @@ config = X402Config(
561
571
 
562
572
  ---
563
573
 
574
+ ## Multi-Token Support
575
+
576
+ The SDK supports 6 stablecoins on EVM chains. Use the token helper functions to query and work with different tokens.
577
+
578
+ ### Querying Token Support
579
+
580
+ ```python
581
+ from uvd_x402_sdk import (
582
+ TokenType,
583
+ get_token_config,
584
+ get_supported_tokens,
585
+ is_token_supported,
586
+ get_networks_by_token,
587
+ )
588
+
589
+ # Check which tokens a network supports
590
+ tokens = get_supported_tokens("ethereum")
591
+ print(tokens) # ['usdc', 'eurc', 'ausd', 'pyusd']
592
+
593
+ tokens = get_supported_tokens("base")
594
+ print(tokens) # ['usdc', 'eurc']
595
+
596
+ # Check if a specific token is supported
597
+ if is_token_supported("ethereum", "eurc"):
598
+ print("EURC is available on Ethereum!")
599
+
600
+ # Get token configuration
601
+ config = get_token_config("ethereum", "eurc")
602
+ if config:
603
+ print(f"EURC address: {config.address}")
604
+ print(f"Decimals: {config.decimals}")
605
+ print(f"EIP-712 name: {config.name}")
606
+ print(f"EIP-712 version: {config.version}")
607
+
608
+ # Find all networks that support a token
609
+ networks = get_networks_by_token("eurc")
610
+ for network in networks:
611
+ print(f"EURC available on: {network.display_name}")
612
+ # Output: EURC available on: Ethereum, Base, Avalanche C-Chain
613
+ ```
614
+
615
+ ### Token Configuration
616
+
617
+ Each token has specific EIP-712 domain parameters required for signing:
618
+
619
+ ```python
620
+ from uvd_x402_sdk import TokenConfig, get_token_config
621
+
622
+ # TokenConfig structure
623
+ # - address: Contract address
624
+ # - decimals: Token decimals (6 for all supported stablecoins)
625
+ # - name: EIP-712 domain name (e.g., "USD Coin", "EURC", "Gho Token")
626
+ # - version: EIP-712 domain version
627
+
628
+ # Example: Get EURC config on Base
629
+ eurc = get_token_config("base", "eurc")
630
+ # TokenConfig(
631
+ # address="0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42",
632
+ # decimals=6,
633
+ # name="EURC",
634
+ # version="2"
635
+ # )
636
+
637
+ # Example: Get PYUSD config on Ethereum
638
+ pyusd = get_token_config("ethereum", "pyusd")
639
+ # TokenConfig(
640
+ # address="0x6c3ea9036406852006290770BEdFcAbA0e23A0e8",
641
+ # decimals=6,
642
+ # name="PayPal USD",
643
+ # version="1"
644
+ # )
645
+ ```
646
+
647
+ ### Available Tokens
648
+
649
+ | Token | Description | Decimals | Issuer |
650
+ |-------|-------------|----------|--------|
651
+ | `usdc` | USD Coin | 6 | Circle |
652
+ | `eurc` | Euro Coin | 6 | Circle |
653
+ | `ausd` | Agora USD | 6 | Agora Finance |
654
+ | `pyusd` | PayPal USD | 6 | PayPal/Paxos |
655
+
656
+ ---
657
+
564
658
  ## Error Handling
565
659
 
566
660
  ```python
@@ -606,7 +700,7 @@ except X402Error as e:
606
700
 
607
701
  ## How x402 Works
608
702
 
609
- The x402 protocol enables gasless USDC payments:
703
+ The x402 protocol enables gasless stablecoin payments (USDC, EURC, AUSD, PYUSD):
610
704
 
611
705
  ```
612
706
  1. User Request --> Client sends request without payment
@@ -649,13 +743,14 @@ The facilitator (https://facilitator.ultravioletadao.xyz) handles all on-chain i
649
743
  ## Security
650
744
 
651
745
  - Users **NEVER** pay gas or submit transactions directly
652
- - **EVM**: Users sign EIP-712 structured messages only (no transaction broadcast)
746
+ - **EVM**: Users sign EIP-712 structured messages for any supported stablecoin (USDC, EURC, AUSD, PYUSD)
653
747
  - **Solana/Fogo**: Users sign partial transactions (facilitator co-signs and submits)
654
748
  - **Stellar**: Users sign Soroban authorization entries only
655
749
  - **NEAR**: Users sign NEP-366 meta-transactions (DelegateAction)
656
750
  - The facilitator submits and pays for all on-chain transactions
657
751
  - All signatures include expiration timestamps (`validBefore`) for replay protection
658
752
  - Nonces prevent double-spending of authorizations
753
+ - Each token has verified contract addresses and EIP-712 domain parameters
659
754
 
660
755
  ---
661
756
 
@@ -733,6 +828,23 @@ MIT License - see LICENSE file.
733
828
 
734
829
  ## Changelog
735
830
 
831
+ ### v0.3.1 (2025-12-21)
832
+
833
+ - Removed GHO and crvUSD token support (not EIP-3009 compatible)
834
+ - SDK now supports 4 stablecoins: USDC, EURC, AUSD, PYUSD
835
+
836
+ ### v0.3.0 (2025-12-20)
837
+
838
+ - **Multi-Stablecoin Support**: Added support for 4 stablecoins on EVM chains
839
+ - USDC (all EVM chains)
840
+ - EURC (Ethereum, Base, Avalanche)
841
+ - AUSD (Ethereum, Arbitrum, Avalanche, Polygon, Monad)
842
+ - PYUSD (Ethereum)
843
+ - Added `TokenType` literal type and `TokenConfig` dataclass
844
+ - Added token helper functions: `get_token_config()`, `get_supported_tokens()`, `is_token_supported()`, `get_networks_by_token()`
845
+ - Added `tokens` field to `NetworkConfig` for multi-token configurations
846
+ - Updated EVM network configurations with token contract addresses and EIP-712 domain parameters
847
+
736
848
  ### v0.2.2 (2025-12-16)
737
849
 
738
850
  - Added Security section to documentation
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "uvd-x402-sdk"
7
- version = "0.2.3"
8
- description = "Python SDK for integrating x402 payments via the Ultravioleta DAO facilitator"
7
+ version = "0.3.1"
8
+ description = "Python SDK for x402 payments - gasless crypto payments across 14 blockchains with multi-stablecoin support (USDC, EURC, AUSD, PYUSD)"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
11
11
  authors = [
@@ -16,12 +16,17 @@ keywords = [
16
16
  "payments",
17
17
  "crypto",
18
18
  "usdc",
19
+ "eurc",
20
+ "stablecoin",
19
21
  "web3",
20
22
  "evm",
21
23
  "solana",
22
24
  "near",
23
25
  "stellar",
24
26
  "facilitator",
27
+ "gasless",
28
+ "eip-712",
29
+ "eip-3009",
25
30
  ]
26
31
  classifiers = [
27
32
  "Development Status :: 4 - Beta",
@@ -37,7 +37,7 @@ Supported Networks (14 total):
37
37
  - Stellar (1): Stellar
38
38
  """
39
39
 
40
- __version__ = "0.2.3"
40
+ __version__ = "0.3.1"
41
41
  __author__ = "Ultravioleta DAO"
42
42
 
43
43
  from uvd_x402_sdk.client import X402Client
@@ -83,6 +83,14 @@ from uvd_x402_sdk.networks import (
83
83
  get_supported_chain_ids,
84
84
  get_supported_network_names,
85
85
  NetworkType,
86
+ # Token types (multi-stablecoin support)
87
+ TokenType,
88
+ TokenConfig,
89
+ ALL_TOKEN_TYPES,
90
+ get_token_config,
91
+ get_supported_tokens,
92
+ is_token_supported,
93
+ get_networks_by_token,
86
94
  # CAIP-2 utilities (v2 support)
87
95
  parse_caip2_network,
88
96
  to_caip2_network,
@@ -151,6 +159,14 @@ __all__ = [
151
159
  "get_supported_chain_ids",
152
160
  "get_supported_network_names",
153
161
  "NetworkType",
162
+ # Token types (multi-stablecoin support)
163
+ "TokenType",
164
+ "TokenConfig",
165
+ "ALL_TOKEN_TYPES",
166
+ "get_token_config",
167
+ "get_supported_tokens",
168
+ "is_token_supported",
169
+ "get_networks_by_token",
154
170
  # CAIP-2 utilities
155
171
  "parse_caip2_network",
156
172
  "to_caip2_network",
@@ -11,12 +11,22 @@ The SDK supports 14 mainnet networks out of the box:
11
11
  - 1 NEAR: NEAR Protocol
12
12
  - 1 Stellar: Stellar
13
13
 
14
+ Multi-token support (EVM chains only):
15
+ - USDC: All chains
16
+ - EURC: Ethereum, Base, Avalanche
17
+ - AUSD: Ethereum, Arbitrum, Avalanche, Polygon, Monad
18
+ - PYUSD: Ethereum
19
+
14
20
  You can register custom networks using `register_network()`.
15
21
  """
16
22
 
17
23
  from uvd_x402_sdk.networks.base import (
18
24
  NetworkConfig,
19
25
  NetworkType,
26
+ # Token types (multi-stablecoin support)
27
+ TokenType,
28
+ TokenConfig,
29
+ ALL_TOKEN_TYPES,
20
30
  get_network,
21
31
  get_network_by_chain_id,
22
32
  register_network,
@@ -24,6 +34,11 @@ from uvd_x402_sdk.networks.base import (
24
34
  get_supported_chain_ids,
25
35
  get_supported_network_names,
26
36
  SUPPORTED_NETWORKS,
37
+ # Token helper functions
38
+ get_token_config,
39
+ get_supported_tokens,
40
+ is_token_supported,
41
+ get_networks_by_token,
27
42
  # CAIP-2 utilities (x402 v2)
28
43
  parse_caip2_network,
29
44
  to_caip2_network,
@@ -38,6 +53,10 @@ __all__ = [
38
53
  # Core
39
54
  "NetworkConfig",
40
55
  "NetworkType",
56
+ # Token types (multi-stablecoin support)
57
+ "TokenType",
58
+ "TokenConfig",
59
+ "ALL_TOKEN_TYPES",
41
60
  # Registry functions
42
61
  "get_network",
43
62
  "get_network_by_chain_id",
@@ -46,6 +65,11 @@ __all__ = [
46
65
  "get_supported_chain_ids",
47
66
  "get_supported_network_names",
48
67
  "SUPPORTED_NETWORKS",
68
+ # Token helper functions
69
+ "get_token_config",
70
+ "get_supported_tokens",
71
+ "is_token_supported",
72
+ "get_networks_by_token",
49
73
  # CAIP-2 utilities (x402 v2)
50
74
  "parse_caip2_network",
51
75
  "to_caip2_network",
@@ -4,12 +4,46 @@ Base network configuration and registry.
4
4
  This module provides the foundation for network configuration, including:
5
5
  - NetworkConfig dataclass for defining network parameters
6
6
  - NetworkType enum for categorizing networks
7
+ - TokenType for multi-stablecoin support
7
8
  - Global registry for storing and retrieving network configurations
8
9
  """
9
10
 
10
11
  from dataclasses import dataclass, field
11
12
  from enum import Enum
12
- from typing import Dict, List, Optional, Any
13
+ from typing import Dict, List, Literal, Optional, Any
14
+
15
+
16
+ # =============================================================================
17
+ # Token Type Definitions (Multi-Stablecoin Support)
18
+ # =============================================================================
19
+
20
+ # Supported stablecoin token types
21
+ # - usdc: USD Coin (Circle) - 6 decimals
22
+ # - eurc: Euro Coin (Circle) - 6 decimals
23
+ # - ausd: Agora USD (Agora Finance) - 6 decimals
24
+ # - pyusd: PayPal USD (PayPal/Paxos) - 6 decimals
25
+ TokenType = Literal["usdc", "eurc", "ausd", "pyusd"]
26
+
27
+ # All supported token types
28
+ ALL_TOKEN_TYPES: List[TokenType] = ["usdc", "eurc", "ausd", "pyusd"]
29
+
30
+
31
+ @dataclass
32
+ class TokenConfig:
33
+ """
34
+ Configuration for a stablecoin token on a specific network.
35
+
36
+ Attributes:
37
+ address: Contract address of the token
38
+ decimals: Number of decimals (6 for all supported stablecoins)
39
+ name: Token name for EIP-712 domain (e.g., "USD Coin" or "USDC")
40
+ version: Token version for EIP-712 domain
41
+ """
42
+
43
+ address: str
44
+ decimals: int
45
+ name: str
46
+ version: str
13
47
 
14
48
 
15
49
  class NetworkType(Enum):
@@ -53,6 +87,7 @@ class NetworkConfig:
53
87
  usdc_domain_version: EIP-712 domain version (EVM only)
54
88
  rpc_url: Default RPC endpoint
55
89
  enabled: Whether network is currently enabled
90
+ tokens: Multi-token configurations (EVM chains only, maps token type to config)
56
91
  extra_config: Additional network-specific configuration
57
92
  """
58
93
 
@@ -66,6 +101,7 @@ class NetworkConfig:
66
101
  usdc_domain_version: str = "2"
67
102
  rpc_url: str = ""
68
103
  enabled: bool = True
104
+ tokens: Dict[TokenType, TokenConfig] = field(default_factory=dict)
69
105
  extra_config: Dict[str, Any] = field(default_factory=dict)
70
106
 
71
107
  def __post_init__(self) -> None:
@@ -209,6 +245,119 @@ def get_supported_network_names() -> List[str]:
209
245
  SUPPORTED_NETWORKS = _NETWORK_REGISTRY
210
246
 
211
247
 
248
+ # =============================================================================
249
+ # Token Helper Functions (Multi-Stablecoin Support)
250
+ # =============================================================================
251
+
252
+
253
+ def get_token_config(network_name: str, token_type: TokenType = "usdc") -> Optional[TokenConfig]:
254
+ """
255
+ Get token configuration for a specific network and token type.
256
+
257
+ Args:
258
+ network_name: Network identifier (e.g., 'base', 'ethereum')
259
+ token_type: Token type (defaults to 'usdc')
260
+
261
+ Returns:
262
+ TokenConfig if the token is supported on this network, None otherwise
263
+
264
+ Example:
265
+ >>> config = get_token_config('ethereum', 'eurc')
266
+ >>> if config:
267
+ ... print(f"EURC address: {config.address}")
268
+ """
269
+ network = get_network(network_name)
270
+ if not network:
271
+ return None
272
+
273
+ # Check tokens dict first (multi-token support)
274
+ if token_type in network.tokens:
275
+ return network.tokens[token_type]
276
+
277
+ # Fall back to USDC config for backward compatibility
278
+ if token_type == "usdc":
279
+ return TokenConfig(
280
+ address=network.usdc_address,
281
+ decimals=network.usdc_decimals,
282
+ name=network.usdc_domain_name,
283
+ version=network.usdc_domain_version,
284
+ )
285
+
286
+ return None
287
+
288
+
289
+ def get_supported_tokens(network_name: str) -> List[TokenType]:
290
+ """
291
+ Get list of supported token types for a network.
292
+
293
+ Args:
294
+ network_name: Network identifier
295
+
296
+ Returns:
297
+ List of supported TokenType values
298
+
299
+ Example:
300
+ >>> tokens = get_supported_tokens('ethereum')
301
+ >>> print(tokens) # ['usdc', 'eurc', 'ausd', 'pyusd']
302
+ """
303
+ network = get_network(network_name)
304
+ if not network:
305
+ return []
306
+
307
+ # Get tokens from the tokens dict
308
+ tokens: List[TokenType] = list(network.tokens.keys())
309
+
310
+ # Always include 'usdc' if the network has USDC configured
311
+ if "usdc" not in tokens and network.usdc_address:
312
+ tokens.insert(0, "usdc")
313
+
314
+ return tokens
315
+
316
+
317
+ def is_token_supported(network_name: str, token_type: TokenType) -> bool:
318
+ """
319
+ Check if a specific token is supported on a network.
320
+
321
+ Args:
322
+ network_name: Network identifier
323
+ token_type: Token type to check
324
+
325
+ Returns:
326
+ True if token is supported, False otherwise
327
+
328
+ Example:
329
+ >>> is_token_supported('ethereum', 'eurc')
330
+ True
331
+ >>> is_token_supported('celo', 'eurc')
332
+ False
333
+ """
334
+ return get_token_config(network_name, token_type) is not None
335
+
336
+
337
+ def get_networks_by_token(token_type: TokenType) -> List[NetworkConfig]:
338
+ """
339
+ Get all networks that support a specific token type.
340
+
341
+ Args:
342
+ token_type: Token type to search for
343
+
344
+ Returns:
345
+ List of NetworkConfig instances that support the token
346
+
347
+ Example:
348
+ >>> networks = get_networks_by_token('eurc')
349
+ >>> for n in networks:
350
+ ... print(n.name) # ethereum, base, avalanche
351
+ """
352
+ result = []
353
+ for network in _NETWORK_REGISTRY.values():
354
+ if not network.enabled:
355
+ continue
356
+ if is_token_supported(network.name, token_type):
357
+ result.append(network)
358
+ return result
359
+
360
+
212
361
  # =============================================================================
213
362
  # CAIP-2 Utilities (x402 v2 support)
214
363
  # =============================================================================
@@ -7,11 +7,18 @@ Each chain uses ERC-3009 TransferWithAuthorization for USDC transfers.
7
7
  Important EIP-712 domain considerations:
8
8
  - Most chains use 'USD Coin' as the domain name
9
9
  - Celo, HyperEVM, Unichain, Monad use 'USDC' as the domain name
10
+
11
+ Multi-token support:
12
+ - USDC: All chains (6 decimals)
13
+ - EURC: Ethereum, Base, Avalanche (6 decimals)
14
+ - AUSD: Ethereum, Arbitrum, Avalanche, Polygon, Monad (6 decimals)
15
+ - PYUSD: Ethereum (6 decimals)
10
16
  """
11
17
 
12
18
  from uvd_x402_sdk.networks.base import (
13
19
  NetworkConfig,
14
20
  NetworkType,
21
+ TokenConfig,
15
22
  register_network,
16
23
  )
17
24
 
@@ -19,7 +26,7 @@ from uvd_x402_sdk.networks.base import (
19
26
  # EVM Networks Configuration
20
27
  # =============================================================================
21
28
 
22
- # Base (Layer 2)
29
+ # Base (Layer 2) - supports USDC, EURC
23
30
  BASE = NetworkConfig(
24
31
  name="base",
25
32
  display_name="Base",
@@ -31,9 +38,23 @@ BASE = NetworkConfig(
31
38
  usdc_domain_version="2",
32
39
  rpc_url="https://mainnet.base.org",
33
40
  enabled=True,
41
+ tokens={
42
+ "usdc": TokenConfig(
43
+ address="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
44
+ decimals=6,
45
+ name="USD Coin",
46
+ version="2",
47
+ ),
48
+ "eurc": TokenConfig(
49
+ address="0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42",
50
+ decimals=6,
51
+ name="EURC",
52
+ version="2",
53
+ ),
54
+ },
34
55
  )
35
56
 
36
- # Ethereum Mainnet
57
+ # Ethereum Mainnet - supports USDC, EURC, AUSD, PYUSD
37
58
  ETHEREUM = NetworkConfig(
38
59
  name="ethereum",
39
60
  display_name="Ethereum",
@@ -45,9 +66,35 @@ ETHEREUM = NetworkConfig(
45
66
  usdc_domain_version="2",
46
67
  rpc_url="https://eth.llamarpc.com",
47
68
  enabled=True,
69
+ tokens={
70
+ "usdc": TokenConfig(
71
+ address="0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
72
+ decimals=6,
73
+ name="USD Coin",
74
+ version="2",
75
+ ),
76
+ "eurc": TokenConfig(
77
+ address="0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c",
78
+ decimals=6,
79
+ name="EURC",
80
+ version="2",
81
+ ),
82
+ "ausd": TokenConfig(
83
+ address="0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
84
+ decimals=6,
85
+ name="Agora USD",
86
+ version="1",
87
+ ),
88
+ "pyusd": TokenConfig(
89
+ address="0x6c3ea9036406852006290770BEdFcAbA0e23A0e8",
90
+ decimals=6,
91
+ name="PayPal USD",
92
+ version="1",
93
+ ),
94
+ },
48
95
  )
49
96
 
50
- # Polygon (PoS)
97
+ # Polygon (PoS) - supports USDC, AUSD
51
98
  POLYGON = NetworkConfig(
52
99
  name="polygon",
53
100
  display_name="Polygon",
@@ -59,9 +106,23 @@ POLYGON = NetworkConfig(
59
106
  usdc_domain_version="2",
60
107
  rpc_url="https://polygon-rpc.com",
61
108
  enabled=True,
109
+ tokens={
110
+ "usdc": TokenConfig(
111
+ address="0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
112
+ decimals=6,
113
+ name="USD Coin",
114
+ version="2",
115
+ ),
116
+ "ausd": TokenConfig(
117
+ address="0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
118
+ decimals=6,
119
+ name="Agora USD",
120
+ version="1",
121
+ ),
122
+ },
62
123
  )
63
124
 
64
- # Arbitrum One
125
+ # Arbitrum One - supports USDC, AUSD
65
126
  ARBITRUM = NetworkConfig(
66
127
  name="arbitrum",
67
128
  display_name="Arbitrum One",
@@ -73,6 +134,20 @@ ARBITRUM = NetworkConfig(
73
134
  usdc_domain_version="2",
74
135
  rpc_url="https://arb1.arbitrum.io/rpc",
75
136
  enabled=True,
137
+ tokens={
138
+ "usdc": TokenConfig(
139
+ address="0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
140
+ decimals=6,
141
+ name="USD Coin",
142
+ version="2",
143
+ ),
144
+ "ausd": TokenConfig(
145
+ address="0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
146
+ decimals=6,
147
+ name="Agora USD",
148
+ version="1",
149
+ ),
150
+ },
76
151
  )
77
152
 
78
153
  # Optimism
@@ -89,7 +164,7 @@ OPTIMISM = NetworkConfig(
89
164
  enabled=True,
90
165
  )
91
166
 
92
- # Avalanche C-Chain
167
+ # Avalanche C-Chain - supports USDC, EURC, AUSD
93
168
  AVALANCHE = NetworkConfig(
94
169
  name="avalanche",
95
170
  display_name="Avalanche C-Chain",
@@ -101,6 +176,26 @@ AVALANCHE = NetworkConfig(
101
176
  usdc_domain_version="2",
102
177
  rpc_url="https://avalanche-c-chain-rpc.publicnode.com",
103
178
  enabled=True,
179
+ tokens={
180
+ "usdc": TokenConfig(
181
+ address="0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
182
+ decimals=6,
183
+ name="USD Coin",
184
+ version="2",
185
+ ),
186
+ "eurc": TokenConfig(
187
+ address="0xC891EB4cbdEFf6e073e859e987815Ed1505c2ACD",
188
+ decimals=6,
189
+ name="EURC",
190
+ version="2",
191
+ ),
192
+ "ausd": TokenConfig(
193
+ address="0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
194
+ decimals=6,
195
+ name="Agora USD",
196
+ version="1",
197
+ ),
198
+ },
104
199
  )
105
200
 
106
201
  # Celo
@@ -148,7 +243,7 @@ UNICHAIN = NetworkConfig(
148
243
  enabled=True,
149
244
  )
150
245
 
151
- # Monad
246
+ # Monad - supports USDC, AUSD
152
247
  # NOTE: Monad uses 'USDC' (not 'USD Coin') for EIP-712 domain name
153
248
  MONAD = NetworkConfig(
154
249
  name="monad",
@@ -161,6 +256,20 @@ MONAD = NetworkConfig(
161
256
  usdc_domain_version="2",
162
257
  rpc_url="https://rpc.monad.xyz",
163
258
  enabled=True,
259
+ tokens={
260
+ "usdc": TokenConfig(
261
+ address="0x754704bc059f8c67012fed69bc8a327a5aafb603",
262
+ decimals=6,
263
+ name="USDC",
264
+ version="2",
265
+ ),
266
+ "ausd": TokenConfig(
267
+ address="0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
268
+ decimals=6,
269
+ name="Agora USD",
270
+ version="1",
271
+ ),
272
+ },
164
273
  )
165
274
 
166
275
  # =============================================================================
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: uvd-x402-sdk
3
- Version: 0.2.3
4
- Summary: Python SDK for integrating x402 payments via the Ultravioleta DAO facilitator
3
+ Version: 0.3.1
4
+ Summary: Python SDK for x402 payments - gasless crypto payments across 14 blockchains with multi-stablecoin support (USDC, EURC, AUSD, PYUSD)
5
5
  Author-email: Ultravioleta DAO <dev@ultravioletadao.xyz>
6
6
  Project-URL: Homepage, https://github.com/UltravioletaDAO/uvd-x402-sdk-python
7
7
  Project-URL: Documentation, https://docs.ultravioletadao.xyz/x402-sdk
8
8
  Project-URL: Repository, https://github.com/UltravioletaDAO/uvd-x402-sdk-python
9
9
  Project-URL: Issues, https://github.com/UltravioletaDAO/uvd-x402-sdk-python/issues
10
- Keywords: x402,payments,crypto,usdc,web3,evm,solana,near,stellar,facilitator
10
+ Keywords: x402,payments,crypto,usdc,eurc,stablecoin,web3,evm,solana,near,stellar,facilitator,gasless,eip-712,eip-3009
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: MIT License
@@ -51,17 +51,18 @@ Requires-Dist: httpx>=0.24.0; extra == "dev"
51
51
 
52
52
  Python SDK for integrating **x402 cryptocurrency payments** via the Ultravioleta DAO facilitator.
53
53
 
54
- Accept USDC payments across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
54
+ Accept **gasless stablecoin payments** across **14 blockchain networks** with a single integration. The SDK handles signature verification, on-chain settlement, and all the complexity of multi-chain payments.
55
55
 
56
56
  ## Features
57
57
 
58
58
  - **14 Networks**: EVM chains (Base, Ethereum, Polygon, etc.), SVM chains (Solana, Fogo), NEAR, and Stellar
59
+ - **4 Stablecoins**: USDC, EURC, AUSD, PYUSD (EVM chains)
59
60
  - **x402 v1 & v2**: Full support for both protocol versions with auto-detection
60
61
  - **Framework Integrations**: Flask, FastAPI, Django, AWS Lambda
61
- - **Gasless Payments**: Users sign authorizations, facilitator pays all network fees
62
+ - **Gasless Payments**: Users sign EIP-712/EIP-3009 authorizations, facilitator pays all network fees
62
63
  - **Simple API**: Decorators and middleware for quick integration
63
64
  - **Type Safety**: Full Pydantic models and type hints
64
- - **Extensible**: Register custom networks easily
65
+ - **Extensible**: Register custom networks and tokens easily
65
66
 
66
67
  ## Quick Start (5 Lines)
67
68
 
@@ -93,6 +94,15 @@ print(f"Paid by {result.payer_address}, tx: {result.transaction_hash}")
93
94
  | NEAR | NEAR | - | `near:mainnet` | Active |
94
95
  | Stellar | Stellar | - | `stellar:pubnet` | Active |
95
96
 
97
+ ### Supported Tokens (EVM Chains)
98
+
99
+ | Token | Networks | Decimals |
100
+ |-------|----------|----------|
101
+ | USDC | All EVM chains | 6 |
102
+ | EURC | Ethereum, Base, Avalanche | 6 |
103
+ | AUSD | Ethereum, Arbitrum, Avalanche, Polygon, Monad | 6 |
104
+ | PYUSD | Ethereum | 6 |
105
+
96
106
  ## Installation
97
107
 
98
108
  ```bash
@@ -610,6 +620,90 @@ config = X402Config(
610
620
 
611
621
  ---
612
622
 
623
+ ## Multi-Token Support
624
+
625
+ The SDK supports 6 stablecoins on EVM chains. Use the token helper functions to query and work with different tokens.
626
+
627
+ ### Querying Token Support
628
+
629
+ ```python
630
+ from uvd_x402_sdk import (
631
+ TokenType,
632
+ get_token_config,
633
+ get_supported_tokens,
634
+ is_token_supported,
635
+ get_networks_by_token,
636
+ )
637
+
638
+ # Check which tokens a network supports
639
+ tokens = get_supported_tokens("ethereum")
640
+ print(tokens) # ['usdc', 'eurc', 'ausd', 'pyusd']
641
+
642
+ tokens = get_supported_tokens("base")
643
+ print(tokens) # ['usdc', 'eurc']
644
+
645
+ # Check if a specific token is supported
646
+ if is_token_supported("ethereum", "eurc"):
647
+ print("EURC is available on Ethereum!")
648
+
649
+ # Get token configuration
650
+ config = get_token_config("ethereum", "eurc")
651
+ if config:
652
+ print(f"EURC address: {config.address}")
653
+ print(f"Decimals: {config.decimals}")
654
+ print(f"EIP-712 name: {config.name}")
655
+ print(f"EIP-712 version: {config.version}")
656
+
657
+ # Find all networks that support a token
658
+ networks = get_networks_by_token("eurc")
659
+ for network in networks:
660
+ print(f"EURC available on: {network.display_name}")
661
+ # Output: EURC available on: Ethereum, Base, Avalanche C-Chain
662
+ ```
663
+
664
+ ### Token Configuration
665
+
666
+ Each token has specific EIP-712 domain parameters required for signing:
667
+
668
+ ```python
669
+ from uvd_x402_sdk import TokenConfig, get_token_config
670
+
671
+ # TokenConfig structure
672
+ # - address: Contract address
673
+ # - decimals: Token decimals (6 for all supported stablecoins)
674
+ # - name: EIP-712 domain name (e.g., "USD Coin", "EURC", "Gho Token")
675
+ # - version: EIP-712 domain version
676
+
677
+ # Example: Get EURC config on Base
678
+ eurc = get_token_config("base", "eurc")
679
+ # TokenConfig(
680
+ # address="0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42",
681
+ # decimals=6,
682
+ # name="EURC",
683
+ # version="2"
684
+ # )
685
+
686
+ # Example: Get PYUSD config on Ethereum
687
+ pyusd = get_token_config("ethereum", "pyusd")
688
+ # TokenConfig(
689
+ # address="0x6c3ea9036406852006290770BEdFcAbA0e23A0e8",
690
+ # decimals=6,
691
+ # name="PayPal USD",
692
+ # version="1"
693
+ # )
694
+ ```
695
+
696
+ ### Available Tokens
697
+
698
+ | Token | Description | Decimals | Issuer |
699
+ |-------|-------------|----------|--------|
700
+ | `usdc` | USD Coin | 6 | Circle |
701
+ | `eurc` | Euro Coin | 6 | Circle |
702
+ | `ausd` | Agora USD | 6 | Agora Finance |
703
+ | `pyusd` | PayPal USD | 6 | PayPal/Paxos |
704
+
705
+ ---
706
+
613
707
  ## Error Handling
614
708
 
615
709
  ```python
@@ -655,7 +749,7 @@ except X402Error as e:
655
749
 
656
750
  ## How x402 Works
657
751
 
658
- The x402 protocol enables gasless USDC payments:
752
+ The x402 protocol enables gasless stablecoin payments (USDC, EURC, AUSD, PYUSD):
659
753
 
660
754
  ```
661
755
  1. User Request --> Client sends request without payment
@@ -698,13 +792,14 @@ The facilitator (https://facilitator.ultravioletadao.xyz) handles all on-chain i
698
792
  ## Security
699
793
 
700
794
  - Users **NEVER** pay gas or submit transactions directly
701
- - **EVM**: Users sign EIP-712 structured messages only (no transaction broadcast)
795
+ - **EVM**: Users sign EIP-712 structured messages for any supported stablecoin (USDC, EURC, AUSD, PYUSD)
702
796
  - **Solana/Fogo**: Users sign partial transactions (facilitator co-signs and submits)
703
797
  - **Stellar**: Users sign Soroban authorization entries only
704
798
  - **NEAR**: Users sign NEP-366 meta-transactions (DelegateAction)
705
799
  - The facilitator submits and pays for all on-chain transactions
706
800
  - All signatures include expiration timestamps (`validBefore`) for replay protection
707
801
  - Nonces prevent double-spending of authorizations
802
+ - Each token has verified contract addresses and EIP-712 domain parameters
708
803
 
709
804
  ---
710
805
 
@@ -782,6 +877,23 @@ MIT License - see LICENSE file.
782
877
 
783
878
  ## Changelog
784
879
 
880
+ ### v0.3.1 (2025-12-21)
881
+
882
+ - Removed GHO and crvUSD token support (not EIP-3009 compatible)
883
+ - SDK now supports 4 stablecoins: USDC, EURC, AUSD, PYUSD
884
+
885
+ ### v0.3.0 (2025-12-20)
886
+
887
+ - **Multi-Stablecoin Support**: Added support for 4 stablecoins on EVM chains
888
+ - USDC (all EVM chains)
889
+ - EURC (Ethereum, Base, Avalanche)
890
+ - AUSD (Ethereum, Arbitrum, Avalanche, Polygon, Monad)
891
+ - PYUSD (Ethereum)
892
+ - Added `TokenType` literal type and `TokenConfig` dataclass
893
+ - Added token helper functions: `get_token_config()`, `get_supported_tokens()`, `is_token_supported()`, `get_networks_by_token()`
894
+ - Added `tokens` field to `NetworkConfig` for multi-token configurations
895
+ - Updated EVM network configurations with token contract addresses and EIP-712 domain parameters
896
+
785
897
  ### v0.2.2 (2025-12-16)
786
898
 
787
899
  - Added Security section to documentation
File without changes
File without changes