compass_api_sdk 1.1.1__py3-none-any.whl → 2.2.1rc3__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.
- compass_api_sdk/_hooks/sdkhooks.py +4 -4
- compass_api_sdk/_hooks/types.py +1 -2
- compass_api_sdk/_version.py +3 -3
- compass_api_sdk/aave_v3.py +386 -114
- compass_api_sdk/aerodrome_slipstream.py +104 -54
- compass_api_sdk/basesdk.py +6 -0
- compass_api_sdk/bridge.py +536 -0
- compass_api_sdk/earn.py +2026 -0
- compass_api_sdk/erc_4626_vaults.py +28 -10
- compass_api_sdk/errors/__init__.py +8 -0
- compass_api_sdk/errors/apierror.py +1 -1
- compass_api_sdk/errors/compassapierror.py +1 -1
- compass_api_sdk/errors/httpvalidationerror.py +1 -1
- compass_api_sdk/errors/mintpreparenotfoundresponse_error.py +49 -0
- compass_api_sdk/errors/no_response_error.py +1 -1
- compass_api_sdk/errors/responsevalidationerror.py +1 -1
- compass_api_sdk/ethena.py +36 -10
- compass_api_sdk/gas_sponsorship.py +458 -0
- compass_api_sdk/httpclient.py +0 -1
- compass_api_sdk/models/__init__.py +820 -392
- compass_api_sdk/models/aaveborrowparams.py +4 -13
- compass_api_sdk/models/aaveborrowrequest.py +10 -14
- compass_api_sdk/models/aavehistoricaltransactionsresponse.py +3 -3
- compass_api_sdk/models/aavelooprequest.py +32 -28
- compass_api_sdk/models/aaveposition.py +104 -0
- compass_api_sdk/models/aaverepayparams.py +4 -13
- compass_api_sdk/models/aaverepayrequest.py +10 -14
- compass_api_sdk/models/aavesetuseremodeparams.py +28 -0
- compass_api_sdk/models/aavesetuseremoderequest.py +48 -0
- compass_api_sdk/models/aavesupplyparams.py +4 -13
- compass_api_sdk/models/aavesupplyrequest.py +10 -14
- compass_api_sdk/models/aavevenue.py +27 -0
- compass_api_sdk/models/aavewithdrawparams.py +4 -13
- compass_api_sdk/models/aavewithdrawrequest.py +10 -14
- compass_api_sdk/models/aerodromeenrichedposition.py +109 -0
- compass_api_sdk/models/aerodromelppositionsresponse.py +10 -7
- compass_api_sdk/models/aerodromeslipstreambuyexactlyparams.py +8 -25
- compass_api_sdk/models/aerodromeslipstreambuyexactlyrequest.py +14 -26
- compass_api_sdk/models/aerodromeslipstreamincreaseliquidityprovisionrequest.py +6 -1
- compass_api_sdk/models/aerodromeslipstreammintliquidityprovisionparams.py +8 -25
- compass_api_sdk/models/aerodromeslipstreammintliquidityprovisionrequest.py +14 -26
- compass_api_sdk/models/aerodromeslipstreampoolpriceresponse.py +8 -25
- compass_api_sdk/models/aerodromeslipstreamsellexactlyparams.py +8 -25
- compass_api_sdk/models/aerodromeslipstreamsellexactlyrequest.py +13 -25
- compass_api_sdk/models/aerodromeslipstreamwithdrawliquidityprovisionrequest.py +6 -1
- compass_api_sdk/models/approvetransferrequest.py +32 -0
- compass_api_sdk/models/approvetransferresponse.py +52 -0
- compass_api_sdk/models/batchedsafeoperationsresponse_input.py +52 -0
- compass_api_sdk/models/batchedsafeoperationsresponse_output.py +52 -0
- compass_api_sdk/models/batcheduseroperationsrequest.py +15 -4
- compass_api_sdk/models/chainmarketinfo.py +29 -0
- compass_api_sdk/models/{compass_api_backend_models_generic_read_response_portfolio_tokenbalance.py → compass_api_backend_v1_models_generic_read_response_portfolio_tokenbalance.py} +6 -15
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_check_user_position_apydata.py → compass_api_backend_v1_models_morpho_read_response_check_user_position_apydata.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_check_user_position_asset.py → compass_api_backend_v1_models_morpho_read_response_check_user_position_asset.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_check_user_position_marketstate.py → compass_api_backend_v1_models_morpho_read_response_check_user_position_marketstate.py} +4 -2
- compass_api_sdk/models/compass_api_backend_v1_models_morpho_read_response_check_user_position_vaultposition.py +30 -0
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_check_user_position_vaultstate.py → compass_api_backend_v1_models_morpho_read_response_check_user_position_vaultstate.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_market_apydata.py → compass_api_backend_v1_models_morpho_read_response_get_market_apydata.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_market_asset.py → compass_api_backend_v1_models_morpho_read_response_get_market_asset.py} +5 -5
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_market_marketstate.py → compass_api_backend_v1_models_morpho_read_response_get_market_marketstate.py} +4 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_markets_asset.py → compass_api_backend_v1_models_morpho_read_response_get_markets_asset.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_markets_marketstate.py → compass_api_backend_v1_models_morpho_read_response_get_markets_marketstate.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_vaults_asset.py → compass_api_backend_v1_models_morpho_read_response_get_vaults_asset.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_morpho_read_response_get_vaults_vaultstate.py → compass_api_backend_v1_models_morpho_read_response_get_vaults_vaultstate.py} +4 -2
- compass_api_sdk/models/{compass_api_backend_models_pendle_read_response_market_userposition.py → compass_api_backend_v1_models_pendle_read_response_market_userposition.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_pendle_read_response_positions_tokenbalance.py → compass_api_backend_v1_models_pendle_read_response_positions_tokenbalance.py} +2 -2
- compass_api_sdk/models/{compass_api_backend_models_vaults_read_response_vault_userposition.py → compass_api_backend_v1_models_vaults_read_response_vault_userposition.py} +2 -2
- compass_api_sdk/models/compass_api_backend_v1_models_wildcat_read_response_market_userposition.py +22 -0
- compass_api_sdk/models/compass_api_backend_v2_models_earn_read_response_positions_vaultposition.py +103 -0
- compass_api_sdk/models/compass_api_backend_v2_models_gas_sponsorship_permit_2_typed_data_eip712domain.py +36 -0
- compass_api_sdk/models/compass_api_backend_v2_models_gas_sponsorship_permit_2_typed_data_eip712types.py +36 -0
- compass_api_sdk/models/compass_api_backend_v2_models_gas_sponsorship_permit_typed_data_eip712domain.py +37 -0
- compass_api_sdk/models/compass_api_backend_v2_models_gas_sponsorship_permit_typed_data_eip712types.py +32 -0
- compass_api_sdk/models/compass_api_backend_v2_models_safe_transact_response_batched_safe_operations_eip712domain.py +29 -0
- compass_api_sdk/models/compass_api_backend_v2_models_safe_transact_response_batched_safe_operations_eip712types.py +34 -0
- compass_api_sdk/models/createaccountrequest.py +40 -0
- compass_api_sdk/models/createaccountresponse.py +56 -0
- compass_api_sdk/models/depositevent.py +61 -0
- compass_api_sdk/models/depositforburnrequest.py +77 -0
- compass_api_sdk/models/depositforburnresponse.py +100 -0
- compass_api_sdk/models/earnmanageparams.py +76 -0
- compass_api_sdk/models/earnmanagerequest.py +132 -0
- compass_api_sdk/models/earnmanageresponse.py +52 -0
- compass_api_sdk/models/earnpositionsresponse.py +48 -0
- compass_api_sdk/models/earnswapparams.py +74 -0
- compass_api_sdk/models/earnswaprequest.py +90 -0
- compass_api_sdk/models/earnswapresponse.py +55 -0
- compass_api_sdk/models/earntransferrequest.py +104 -0
- compass_api_sdk/models/earntransferresponse.py +71 -0
- compass_api_sdk/models/eip712domainfield.py +20 -0
- compass_api_sdk/models/eip712field.py +20 -0
- compass_api_sdk/models/ethenadepositrequest.py +6 -1
- compass_api_sdk/models/ethenagetvaultresponse.py +5 -5
- compass_api_sdk/models/ethenarequesttowithdrawrequest.py +6 -1
- compass_api_sdk/models/ethenaunstakerequest.py +6 -1
- compass_api_sdk/models/fee.py +43 -0
- compass_api_sdk/models/listaavemarketsresponse.py +21 -0
- compass_api_sdk/models/marketposition.py +5 -5
- compass_api_sdk/models/maxsupplyapyinfo.py +34 -0
- compass_api_sdk/models/mintpreparecompletedresponse.py +46 -0
- compass_api_sdk/models/mintpreparependingresponse.py +65 -0
- compass_api_sdk/models/mintpreparereadyresponse.py +43 -0
- compass_api_sdk/models/mintpreparerequest.py +25 -0
- compass_api_sdk/models/morphoborrowrequest.py +6 -1
- compass_api_sdk/models/morphocheckuserpositionresponse.py +9 -3
- compass_api_sdk/models/morphodepositrequest.py +6 -1
- compass_api_sdk/models/morphogetmarketresponse.py +72 -31
- compass_api_sdk/models/morphomarket.py +26 -20
- compass_api_sdk/models/morphorepayrequest.py +11 -1
- compass_api_sdk/models/morphosupplycollateralrequest.py +11 -1
- compass_api_sdk/models/morphovault.py +10 -10
- compass_api_sdk/models/morphowithdrawcollateralrequest.py +6 -1
- compass_api_sdk/models/morphowithdrawrequest.py +6 -1
- compass_api_sdk/models/multicallexecuterequest.py +7 -2
- compass_api_sdk/models/odosswapparams.py +9 -30
- compass_api_sdk/models/odosswaprequest.py +15 -33
- compass_api_sdk/models/oneinchswapparams.py +59 -0
- compass_api_sdk/models/openposition.py +7 -7
- compass_api_sdk/models/operationtype.py +11 -0
- compass_api_sdk/models/pendledepositevent.py +49 -0
- compass_api_sdk/models/pendlegetmarketresponse.py +5 -5
- compass_api_sdk/models/pendlemanageliquidityparams.py +2 -15
- compass_api_sdk/models/pendlemanageliquidityrequest.py +8 -16
- compass_api_sdk/models/pendlemarketinfo.py +138 -0
- compass_api_sdk/models/pendlemarketsresponse.py +30 -0
- compass_api_sdk/models/pendleptposition.py +111 -0
- compass_api_sdk/models/pendleptvenue.py +78 -0
- compass_api_sdk/models/pendleredeemyieldrequest.py +6 -1
- compass_api_sdk/models/pendletradeptparams.py +2 -15
- compass_api_sdk/models/pendletradeptrequest.py +8 -16
- compass_api_sdk/models/pendletradeytparams.py +2 -15
- compass_api_sdk/models/pendletradeytrequest.py +8 -16
- compass_api_sdk/models/pendlewithdrawalevent.py +54 -0
- compass_api_sdk/models/permit2typeddata_input.py +46 -0
- compass_api_sdk/models/permit2typeddata_output.py +46 -0
- compass_api_sdk/models/permitfield.py +20 -0
- compass_api_sdk/models/permitmessage.py +39 -0
- compass_api_sdk/models/permittransferfrommessage.py +29 -0
- compass_api_sdk/models/permittypeddataresponse_input.py +50 -0
- compass_api_sdk/models/permittypeddataresponse_output.py +50 -0
- compass_api_sdk/models/portfolio.py +5 -5
- compass_api_sdk/models/positionpnl.py +52 -0
- compass_api_sdk/models/reserve.py +6 -15
- compass_api_sdk/models/safetransactionparams.py +78 -0
- compass_api_sdk/models/safetransactionresponse.py +28 -0
- compass_api_sdk/models/safetxfield.py +20 -0
- compass_api_sdk/models/safetxmessage.py +66 -0
- compass_api_sdk/models/setallowanceparams.py +3 -16
- compass_api_sdk/models/setallowancerequest.py +9 -17
- compass_api_sdk/models/skybuyrequest.py +6 -1
- compass_api_sdk/models/skydepositrequest.py +7 -2
- compass_api_sdk/models/skysellrequest.py +7 -2
- compass_api_sdk/models/skywithdrawrequest.py +7 -2
- compass_api_sdk/models/sponsorgasrequest.py +71 -0
- compass_api_sdk/models/sponsorgasresponse.py +14 -0
- compass_api_sdk/models/tokenbalanceresponse.py +5 -15
- compass_api_sdk/models/tokenconfig.py +30 -0
- compass_api_sdk/models/tokenlistresponse.py +21 -0
- compass_api_sdk/models/tokenmarketdata.py +27 -0
- compass_api_sdk/models/tokenpermissions.py +20 -0
- compass_api_sdk/models/tokentransferparams.py +2 -15
- compass_api_sdk/models/tokentransferrequest.py +8 -16
- compass_api_sdk/models/uniswapbuyexactlyparams.py +8 -33
- compass_api_sdk/models/uniswapbuyexactlyrequest.py +14 -34
- compass_api_sdk/models/uniswapincreaseliquidityprovisionrequest.py +6 -1
- compass_api_sdk/models/uniswapmintliquidityprovisionparams.py +8 -25
- compass_api_sdk/models/uniswapmintliquidityprovisionrequest.py +14 -26
- compass_api_sdk/models/uniswappoolpriceresponse.py +8 -25
- compass_api_sdk/models/uniswapsellexactlyparams.py +4 -29
- compass_api_sdk/models/uniswapsellexactlyrequest.py +10 -30
- compass_api_sdk/models/uniswapwithdrawliquidityprovisionrequest.py +6 -1
- compass_api_sdk/models/unsignedmulticalltransaction.py +34 -3
- compass_api_sdk/models/unsignedtransaction.py +34 -3
- compass_api_sdk/models/unwrapwethrequest.py +6 -1
- compass_api_sdk/models/useroperation.py +33 -24
- compass_api_sdk/models/v1_aave_aave_supported_tokensop.py +1 -1
- compass_api_sdk/models/v1_aave_avg_rateop.py +15 -93
- compass_api_sdk/models/v1_aave_historical_transactionsop.py +15 -15
- compass_api_sdk/models/v1_aave_liquidity_changeop.py +8 -86
- compass_api_sdk/models/v1_aave_rateop.py +8 -86
- compass_api_sdk/models/v1_aave_reserve_overviewop.py +8 -86
- compass_api_sdk/models/v1_aave_std_rateop.py +15 -93
- compass_api_sdk/models/v1_aave_token_priceop.py +8 -86
- compass_api_sdk/models/v1_aave_user_position_per_tokenop.py +14 -92
- compass_api_sdk/models/v1_aave_user_position_summaryop.py +8 -8
- compass_api_sdk/models/v1_aerodrome_slipstream_liquidity_provision_positionsop.py +48 -3
- compass_api_sdk/models/v1_aerodrome_slipstream_pool_priceop.py +12 -168
- compass_api_sdk/models/v1_ethena_vaultop.py +1 -1
- compass_api_sdk/models/v1_generic_allowanceop.py +12 -26
- compass_api_sdk/models/v1_generic_ensop.py +2 -2
- compass_api_sdk/models/v1_generic_portfolioop.py +2 -2
- compass_api_sdk/models/v1_morpho_market_positionop.py +3 -3
- compass_api_sdk/models/v1_morpho_marketop.py +2 -2
- compass_api_sdk/models/v1_morpho_marketsop.py +10 -30
- compass_api_sdk/models/v1_morpho_user_positionop.py +2 -2
- compass_api_sdk/models/v1_morpho_vaultop.py +8 -8
- compass_api_sdk/models/v1_morpho_vaultsop.py +6 -16
- compass_api_sdk/models/v1_pendle_marketop.py +8 -8
- compass_api_sdk/models/v1_pendle_marketsop.py +1 -1
- compass_api_sdk/models/v1_pendle_positionsop.py +2 -2
- compass_api_sdk/models/v1_sky_positionop.py +5 -6
- compass_api_sdk/models/v1_token_balanceop.py +12 -25
- compass_api_sdk/models/{v1_generic_supported_tokensop.py → v1_token_listop.py} +6 -6
- compass_api_sdk/models/v1_token_priceop.py +8 -9
- compass_api_sdk/models/v1_transaction_bundler_aave_loopop.py +6 -6
- compass_api_sdk/models/v1_uniswap_liquidity_provision_in_rangeop.py +2 -2
- compass_api_sdk/models/v1_uniswap_liquidity_provision_positionsop.py +2 -2
- compass_api_sdk/models/v1_uniswap_pool_priceop.py +12 -168
- compass_api_sdk/models/v1_uniswap_quote_buy_exactlyop.py +20 -176
- compass_api_sdk/models/v1_uniswap_quote_sell_exactlyop.py +20 -176
- compass_api_sdk/models/v1_vaults_vaultop.py +8 -8
- compass_api_sdk/models/v1_wildcat_marketop.py +82 -0
- compass_api_sdk/models/v2_cctp_mintop.py +47 -0
- compass_api_sdk/models/v2_earn_aave_marketsop.py +57 -0
- compass_api_sdk/models/v2_earn_pendle_marketsop.py +105 -0
- compass_api_sdk/models/v2_earn_positionsop.py +31 -0
- compass_api_sdk/models/v2_earn_vaultsop.py +105 -0
- compass_api_sdk/models/v2bundlerequest.py +33 -0
- compass_api_sdk/models/v2bundleresponse.py +67 -0
- compass_api_sdk/models/v2useroperation.py +37 -0
- compass_api_sdk/models/vault.py +14 -14
- compass_api_sdk/models/vaultdepositrequest.py +6 -1
- compass_api_sdk/models/vaultgetvaultresponse.py +5 -5
- compass_api_sdk/models/vaultinfo.py +129 -0
- compass_api_sdk/models/vaultsresponse.py +30 -0
- compass_api_sdk/models/vaultvenue.py +27 -0
- compass_api_sdk/models/vaultwithdrawrequest.py +6 -1
- compass_api_sdk/models/wildcatgetmarketresponse.py +151 -0
- compass_api_sdk/models/{redeemunderlying.py → withdraw.py} +2 -2
- compass_api_sdk/models/withdrawalevent.py +61 -0
- compass_api_sdk/models/wrapethrequest.py +6 -1
- compass_api_sdk/morpho.py +126 -78
- compass_api_sdk/pendle.py +68 -44
- compass_api_sdk/sdk.py +18 -11
- compass_api_sdk/sky.py +62 -38
- compass_api_sdk/smart_account.py +10 -2
- compass_api_sdk/swap.py +22 -22
- compass_api_sdk/{token_sdk.py → token.py} +511 -103
- compass_api_sdk/transaction_bundler.py +46 -16
- compass_api_sdk/types/basemodel.py +41 -3
- compass_api_sdk/uniswap_v3.py +152 -114
- compass_api_sdk/universal.py +44 -606
- compass_api_sdk/utils/__init__.py +0 -3
- compass_api_sdk/utils/annotations.py +32 -8
- compass_api_sdk/utils/enums.py +60 -0
- compass_api_sdk/utils/forms.py +21 -10
- compass_api_sdk/utils/queryparams.py +14 -2
- compass_api_sdk/utils/requestbodies.py +3 -3
- compass_api_sdk/utils/retries.py +69 -5
- compass_api_sdk/utils/serializers.py +0 -20
- compass_api_sdk/utils/unmarshal_json_response.py +15 -1
- compass_api_sdk/wildcat.py +208 -0
- compass_api_sdk-2.2.1rc3.dist-info/METADATA +624 -0
- compass_api_sdk-2.2.1rc3.dist-info/RECORD +356 -0
- {compass_api_sdk-1.1.1.dist-info → compass_api_sdk-2.2.1rc3.dist-info}/WHEEL +1 -1
- compass_api_sdk/models/aerodromeposition.py +0 -70
- compass_api_sdk/models/token_enum.py +0 -81
- compass_api_sdk/models/tokenaddressresponse.py +0 -15
- compass_api_sdk/models/tokeninfo.py +0 -17
- compass_api_sdk/models/v1_token_addressop.py +0 -109
- compass_api_sdk/models/vaultposition.py +0 -24
- compass_api_sdk-1.1.1.dist-info/METADATA +0 -592
- compass_api_sdk-1.1.1.dist-info/RECORD +0 -275
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from .basesdk import BaseSDK
|
|
4
|
+
from compass_api_sdk import errors, models, utils
|
|
5
|
+
from compass_api_sdk._hooks import HookContext
|
|
6
|
+
from compass_api_sdk.types import OptionalNullable, UNSET
|
|
7
|
+
from compass_api_sdk.utils.unmarshal_json_response import unmarshal_json_response
|
|
8
|
+
from typing import Any, Mapping, Optional, Union
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class GasSponsorship(BaseSDK):
|
|
12
|
+
def gas_sponsorship_prepare(
|
|
13
|
+
self,
|
|
14
|
+
*,
|
|
15
|
+
owner: str,
|
|
16
|
+
chain: models.Chain,
|
|
17
|
+
eip_712: Union[
|
|
18
|
+
models.SponsorGasRequestEip712, models.SponsorGasRequestEip712TypedDict
|
|
19
|
+
],
|
|
20
|
+
signature: str,
|
|
21
|
+
sender: str,
|
|
22
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
23
|
+
server_url: Optional[str] = None,
|
|
24
|
+
timeout_ms: Optional[int] = None,
|
|
25
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
26
|
+
) -> models.SponsorGasResponse:
|
|
27
|
+
r"""Prepare gas-sponsored transaction
|
|
28
|
+
|
|
29
|
+
Prepare a gas-sponsored transaction from signed EIP-712 typed data.
|
|
30
|
+
|
|
31
|
+
Submit the `owner`'s off-chain signature along with the EIP-712 typed data that was signed. Returns an unsigned transaction for the `sender` to sign and broadcast.
|
|
32
|
+
|
|
33
|
+
**How gas sponsorship works:**
|
|
34
|
+
1. Call an endpoint with `gas_sponsorship=true` (e.g., [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account), [/earn/manage](https://docs.compasslabs.ai/v2/api-reference/earn/manage-earn-position)) to get EIP-712 typed data
|
|
35
|
+
2. Owner signs the typed data off-chain
|
|
36
|
+
3. Submit signature + typed data to this endpoint
|
|
37
|
+
4. Sender signs and broadcasts the returned transaction, paying gas on behalf of the owner
|
|
38
|
+
|
|
39
|
+
**Note:** For gas-sponsored deposits via [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account), the owner must first set up a Permit2 allowance using [/approve_transfer](https://docs.compasslabs.ai/v2/api-reference/gas-sponsorship/approve-token-transfer) (once per token).
|
|
40
|
+
|
|
41
|
+
:param owner: The wallet address that owns the Earn Account.
|
|
42
|
+
:param chain: The chain to use.
|
|
43
|
+
:param eip_712: The EIP-712 typed data that was signed.
|
|
44
|
+
:param signature: The EIP-712 signed typed data signature.
|
|
45
|
+
:param sender: The address of the wallet which will send the transaction.
|
|
46
|
+
:param retries: Override the default retry configuration for this method
|
|
47
|
+
:param server_url: Override the default server URL for this method
|
|
48
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
49
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
50
|
+
"""
|
|
51
|
+
base_url = None
|
|
52
|
+
url_variables = None
|
|
53
|
+
if timeout_ms is None:
|
|
54
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
55
|
+
|
|
56
|
+
if server_url is not None:
|
|
57
|
+
base_url = server_url
|
|
58
|
+
else:
|
|
59
|
+
base_url = self._get_url(base_url, url_variables)
|
|
60
|
+
|
|
61
|
+
request = models.SponsorGasRequest(
|
|
62
|
+
owner=owner,
|
|
63
|
+
chain=chain,
|
|
64
|
+
eip_712=utils.get_pydantic_model(eip_712, models.SponsorGasRequestEip712),
|
|
65
|
+
signature=signature,
|
|
66
|
+
sender=sender,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
req = self._build_request(
|
|
70
|
+
method="POST",
|
|
71
|
+
path="/v2/gas_sponsorship/prepare",
|
|
72
|
+
base_url=base_url,
|
|
73
|
+
url_variables=url_variables,
|
|
74
|
+
request=request,
|
|
75
|
+
request_body_required=True,
|
|
76
|
+
request_has_path_params=False,
|
|
77
|
+
request_has_query_params=True,
|
|
78
|
+
user_agent_header="user-agent",
|
|
79
|
+
accept_header_value="application/json",
|
|
80
|
+
http_headers=http_headers,
|
|
81
|
+
security=self.sdk_configuration.security,
|
|
82
|
+
get_serialized_body=lambda: utils.serialize_request_body(
|
|
83
|
+
request, False, False, "json", models.SponsorGasRequest
|
|
84
|
+
),
|
|
85
|
+
allow_empty_value=None,
|
|
86
|
+
timeout_ms=timeout_ms,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if retries == UNSET:
|
|
90
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
91
|
+
retries = self.sdk_configuration.retry_config
|
|
92
|
+
|
|
93
|
+
retry_config = None
|
|
94
|
+
if isinstance(retries, utils.RetryConfig):
|
|
95
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
96
|
+
|
|
97
|
+
http_res = self.do_request(
|
|
98
|
+
hook_ctx=HookContext(
|
|
99
|
+
config=self.sdk_configuration,
|
|
100
|
+
base_url=base_url or "",
|
|
101
|
+
operation_id="v2_gas_sponsorship_prepare",
|
|
102
|
+
oauth2_scopes=None,
|
|
103
|
+
security_source=self.sdk_configuration.security,
|
|
104
|
+
),
|
|
105
|
+
request=req,
|
|
106
|
+
error_status_codes=["422", "4XX", "5XX"],
|
|
107
|
+
retry_config=retry_config,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
response_data: Any = None
|
|
111
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
112
|
+
return unmarshal_json_response(models.SponsorGasResponse, http_res)
|
|
113
|
+
if utils.match_response(http_res, "422", "application/json"):
|
|
114
|
+
response_data = unmarshal_json_response(
|
|
115
|
+
errors.HTTPValidationErrorData, http_res
|
|
116
|
+
)
|
|
117
|
+
raise errors.HTTPValidationError(response_data, http_res)
|
|
118
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
119
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
120
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
121
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
122
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
123
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
124
|
+
|
|
125
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
126
|
+
|
|
127
|
+
async def gas_sponsorship_prepare_async(
|
|
128
|
+
self,
|
|
129
|
+
*,
|
|
130
|
+
owner: str,
|
|
131
|
+
chain: models.Chain,
|
|
132
|
+
eip_712: Union[
|
|
133
|
+
models.SponsorGasRequestEip712, models.SponsorGasRequestEip712TypedDict
|
|
134
|
+
],
|
|
135
|
+
signature: str,
|
|
136
|
+
sender: str,
|
|
137
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
138
|
+
server_url: Optional[str] = None,
|
|
139
|
+
timeout_ms: Optional[int] = None,
|
|
140
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
141
|
+
) -> models.SponsorGasResponse:
|
|
142
|
+
r"""Prepare gas-sponsored transaction
|
|
143
|
+
|
|
144
|
+
Prepare a gas-sponsored transaction from signed EIP-712 typed data.
|
|
145
|
+
|
|
146
|
+
Submit the `owner`'s off-chain signature along with the EIP-712 typed data that was signed. Returns an unsigned transaction for the `sender` to sign and broadcast.
|
|
147
|
+
|
|
148
|
+
**How gas sponsorship works:**
|
|
149
|
+
1. Call an endpoint with `gas_sponsorship=true` (e.g., [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account), [/earn/manage](https://docs.compasslabs.ai/v2/api-reference/earn/manage-earn-position)) to get EIP-712 typed data
|
|
150
|
+
2. Owner signs the typed data off-chain
|
|
151
|
+
3. Submit signature + typed data to this endpoint
|
|
152
|
+
4. Sender signs and broadcasts the returned transaction, paying gas on behalf of the owner
|
|
153
|
+
|
|
154
|
+
**Note:** For gas-sponsored deposits via [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account), the owner must first set up a Permit2 allowance using [/approve_transfer](https://docs.compasslabs.ai/v2/api-reference/gas-sponsorship/approve-token-transfer) (once per token).
|
|
155
|
+
|
|
156
|
+
:param owner: The wallet address that owns the Earn Account.
|
|
157
|
+
:param chain: The chain to use.
|
|
158
|
+
:param eip_712: The EIP-712 typed data that was signed.
|
|
159
|
+
:param signature: The EIP-712 signed typed data signature.
|
|
160
|
+
:param sender: The address of the wallet which will send the transaction.
|
|
161
|
+
:param retries: Override the default retry configuration for this method
|
|
162
|
+
:param server_url: Override the default server URL for this method
|
|
163
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
164
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
165
|
+
"""
|
|
166
|
+
base_url = None
|
|
167
|
+
url_variables = None
|
|
168
|
+
if timeout_ms is None:
|
|
169
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
170
|
+
|
|
171
|
+
if server_url is not None:
|
|
172
|
+
base_url = server_url
|
|
173
|
+
else:
|
|
174
|
+
base_url = self._get_url(base_url, url_variables)
|
|
175
|
+
|
|
176
|
+
request = models.SponsorGasRequest(
|
|
177
|
+
owner=owner,
|
|
178
|
+
chain=chain,
|
|
179
|
+
eip_712=utils.get_pydantic_model(eip_712, models.SponsorGasRequestEip712),
|
|
180
|
+
signature=signature,
|
|
181
|
+
sender=sender,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
req = self._build_request_async(
|
|
185
|
+
method="POST",
|
|
186
|
+
path="/v2/gas_sponsorship/prepare",
|
|
187
|
+
base_url=base_url,
|
|
188
|
+
url_variables=url_variables,
|
|
189
|
+
request=request,
|
|
190
|
+
request_body_required=True,
|
|
191
|
+
request_has_path_params=False,
|
|
192
|
+
request_has_query_params=True,
|
|
193
|
+
user_agent_header="user-agent",
|
|
194
|
+
accept_header_value="application/json",
|
|
195
|
+
http_headers=http_headers,
|
|
196
|
+
security=self.sdk_configuration.security,
|
|
197
|
+
get_serialized_body=lambda: utils.serialize_request_body(
|
|
198
|
+
request, False, False, "json", models.SponsorGasRequest
|
|
199
|
+
),
|
|
200
|
+
allow_empty_value=None,
|
|
201
|
+
timeout_ms=timeout_ms,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
if retries == UNSET:
|
|
205
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
206
|
+
retries = self.sdk_configuration.retry_config
|
|
207
|
+
|
|
208
|
+
retry_config = None
|
|
209
|
+
if isinstance(retries, utils.RetryConfig):
|
|
210
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
211
|
+
|
|
212
|
+
http_res = await self.do_request_async(
|
|
213
|
+
hook_ctx=HookContext(
|
|
214
|
+
config=self.sdk_configuration,
|
|
215
|
+
base_url=base_url or "",
|
|
216
|
+
operation_id="v2_gas_sponsorship_prepare",
|
|
217
|
+
oauth2_scopes=None,
|
|
218
|
+
security_source=self.sdk_configuration.security,
|
|
219
|
+
),
|
|
220
|
+
request=req,
|
|
221
|
+
error_status_codes=["422", "4XX", "5XX"],
|
|
222
|
+
retry_config=retry_config,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
response_data: Any = None
|
|
226
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
227
|
+
return unmarshal_json_response(models.SponsorGasResponse, http_res)
|
|
228
|
+
if utils.match_response(http_res, "422", "application/json"):
|
|
229
|
+
response_data = unmarshal_json_response(
|
|
230
|
+
errors.HTTPValidationErrorData, http_res
|
|
231
|
+
)
|
|
232
|
+
raise errors.HTTPValidationError(response_data, http_res)
|
|
233
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
234
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
235
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
236
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
237
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
238
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
239
|
+
|
|
240
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
241
|
+
|
|
242
|
+
def gas_sponsorship_approve_transfer(
|
|
243
|
+
self,
|
|
244
|
+
*,
|
|
245
|
+
owner: str,
|
|
246
|
+
chain: models.Chain,
|
|
247
|
+
token: str,
|
|
248
|
+
gas_sponsorship: Optional[bool] = None,
|
|
249
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
250
|
+
server_url: Optional[str] = None,
|
|
251
|
+
timeout_ms: Optional[int] = None,
|
|
252
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
253
|
+
) -> models.ApproveTransferResponse:
|
|
254
|
+
r"""Approve token transfer
|
|
255
|
+
|
|
256
|
+
Set up a one-time Permit2 allowance for gas-sponsored token transfers.
|
|
257
|
+
|
|
258
|
+
Only required when using [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account) with `gas_sponsorship=true`. This allowance only needs to be set up once per token.
|
|
259
|
+
|
|
260
|
+
**With gas sponsorship (`gas_sponsorship=true`):**
|
|
261
|
+
- Returns EIP-712 typed data for the owner to sign off-chain
|
|
262
|
+
- Submit signature + typed data to [/prepare](https://docs.compasslabs.ai/v2/api-reference/gas-sponsorship/prepare-gas-sponsored-transaction)
|
|
263
|
+
- Only works for tokens that support EIP-2612 permit (e.g., USDC)
|
|
264
|
+
|
|
265
|
+
Some tokens, like USDT and WETH, do not support EIP-2612 permit. For these tokens, set `gas_sponsorship=false` to receive an unsigned transaction that the owner must sign, submit, and pay gas for.
|
|
266
|
+
|
|
267
|
+
:param owner: The wallet address that owns the Earn Account.
|
|
268
|
+
:param chain: The chain to use.
|
|
269
|
+
:param token: The token you would like to transfer with gas sponsorship.
|
|
270
|
+
:param gas_sponsorship: Optionally request gas sponsorship. If set to `true`, EIP-712 signature data will be returned that must be signed by the `owner` and submitted to the `/gas_sponsorship/prepare` endpoint.
|
|
271
|
+
:param retries: Override the default retry configuration for this method
|
|
272
|
+
:param server_url: Override the default server URL for this method
|
|
273
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
274
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
275
|
+
"""
|
|
276
|
+
base_url = None
|
|
277
|
+
url_variables = None
|
|
278
|
+
if timeout_ms is None:
|
|
279
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
280
|
+
|
|
281
|
+
if server_url is not None:
|
|
282
|
+
base_url = server_url
|
|
283
|
+
else:
|
|
284
|
+
base_url = self._get_url(base_url, url_variables)
|
|
285
|
+
|
|
286
|
+
request = models.ApproveTransferRequest(
|
|
287
|
+
owner=owner,
|
|
288
|
+
chain=chain,
|
|
289
|
+
token=token,
|
|
290
|
+
gas_sponsorship=gas_sponsorship,
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
req = self._build_request(
|
|
294
|
+
method="POST",
|
|
295
|
+
path="/v2/gas_sponsorship/approve_transfer",
|
|
296
|
+
base_url=base_url,
|
|
297
|
+
url_variables=url_variables,
|
|
298
|
+
request=request,
|
|
299
|
+
request_body_required=True,
|
|
300
|
+
request_has_path_params=False,
|
|
301
|
+
request_has_query_params=True,
|
|
302
|
+
user_agent_header="user-agent",
|
|
303
|
+
accept_header_value="application/json",
|
|
304
|
+
http_headers=http_headers,
|
|
305
|
+
security=self.sdk_configuration.security,
|
|
306
|
+
get_serialized_body=lambda: utils.serialize_request_body(
|
|
307
|
+
request, False, False, "json", models.ApproveTransferRequest
|
|
308
|
+
),
|
|
309
|
+
allow_empty_value=None,
|
|
310
|
+
timeout_ms=timeout_ms,
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
if retries == UNSET:
|
|
314
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
315
|
+
retries = self.sdk_configuration.retry_config
|
|
316
|
+
|
|
317
|
+
retry_config = None
|
|
318
|
+
if isinstance(retries, utils.RetryConfig):
|
|
319
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
320
|
+
|
|
321
|
+
http_res = self.do_request(
|
|
322
|
+
hook_ctx=HookContext(
|
|
323
|
+
config=self.sdk_configuration,
|
|
324
|
+
base_url=base_url or "",
|
|
325
|
+
operation_id="v2_gas_sponsorship_approve_transfer",
|
|
326
|
+
oauth2_scopes=None,
|
|
327
|
+
security_source=self.sdk_configuration.security,
|
|
328
|
+
),
|
|
329
|
+
request=req,
|
|
330
|
+
error_status_codes=["422", "4XX", "5XX"],
|
|
331
|
+
retry_config=retry_config,
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
response_data: Any = None
|
|
335
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
336
|
+
return unmarshal_json_response(models.ApproveTransferResponse, http_res)
|
|
337
|
+
if utils.match_response(http_res, "422", "application/json"):
|
|
338
|
+
response_data = unmarshal_json_response(
|
|
339
|
+
errors.HTTPValidationErrorData, http_res
|
|
340
|
+
)
|
|
341
|
+
raise errors.HTTPValidationError(response_data, http_res)
|
|
342
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
343
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
344
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
345
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
346
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
347
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
348
|
+
|
|
349
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
350
|
+
|
|
351
|
+
async def gas_sponsorship_approve_transfer_async(
|
|
352
|
+
self,
|
|
353
|
+
*,
|
|
354
|
+
owner: str,
|
|
355
|
+
chain: models.Chain,
|
|
356
|
+
token: str,
|
|
357
|
+
gas_sponsorship: Optional[bool] = None,
|
|
358
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
359
|
+
server_url: Optional[str] = None,
|
|
360
|
+
timeout_ms: Optional[int] = None,
|
|
361
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
362
|
+
) -> models.ApproveTransferResponse:
|
|
363
|
+
r"""Approve token transfer
|
|
364
|
+
|
|
365
|
+
Set up a one-time Permit2 allowance for gas-sponsored token transfers.
|
|
366
|
+
|
|
367
|
+
Only required when using [/earn/transfer](https://docs.compasslabs.ai/v2/api-reference/earn/transfer-tokens-tofrom-account) with `gas_sponsorship=true`. This allowance only needs to be set up once per token.
|
|
368
|
+
|
|
369
|
+
**With gas sponsorship (`gas_sponsorship=true`):**
|
|
370
|
+
- Returns EIP-712 typed data for the owner to sign off-chain
|
|
371
|
+
- Submit signature + typed data to [/prepare](https://docs.compasslabs.ai/v2/api-reference/gas-sponsorship/prepare-gas-sponsored-transaction)
|
|
372
|
+
- Only works for tokens that support EIP-2612 permit (e.g., USDC)
|
|
373
|
+
|
|
374
|
+
Some tokens, like USDT and WETH, do not support EIP-2612 permit. For these tokens, set `gas_sponsorship=false` to receive an unsigned transaction that the owner must sign, submit, and pay gas for.
|
|
375
|
+
|
|
376
|
+
:param owner: The wallet address that owns the Earn Account.
|
|
377
|
+
:param chain: The chain to use.
|
|
378
|
+
:param token: The token you would like to transfer with gas sponsorship.
|
|
379
|
+
:param gas_sponsorship: Optionally request gas sponsorship. If set to `true`, EIP-712 signature data will be returned that must be signed by the `owner` and submitted to the `/gas_sponsorship/prepare` endpoint.
|
|
380
|
+
:param retries: Override the default retry configuration for this method
|
|
381
|
+
:param server_url: Override the default server URL for this method
|
|
382
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
383
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
384
|
+
"""
|
|
385
|
+
base_url = None
|
|
386
|
+
url_variables = None
|
|
387
|
+
if timeout_ms is None:
|
|
388
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
389
|
+
|
|
390
|
+
if server_url is not None:
|
|
391
|
+
base_url = server_url
|
|
392
|
+
else:
|
|
393
|
+
base_url = self._get_url(base_url, url_variables)
|
|
394
|
+
|
|
395
|
+
request = models.ApproveTransferRequest(
|
|
396
|
+
owner=owner,
|
|
397
|
+
chain=chain,
|
|
398
|
+
token=token,
|
|
399
|
+
gas_sponsorship=gas_sponsorship,
|
|
400
|
+
)
|
|
401
|
+
|
|
402
|
+
req = self._build_request_async(
|
|
403
|
+
method="POST",
|
|
404
|
+
path="/v2/gas_sponsorship/approve_transfer",
|
|
405
|
+
base_url=base_url,
|
|
406
|
+
url_variables=url_variables,
|
|
407
|
+
request=request,
|
|
408
|
+
request_body_required=True,
|
|
409
|
+
request_has_path_params=False,
|
|
410
|
+
request_has_query_params=True,
|
|
411
|
+
user_agent_header="user-agent",
|
|
412
|
+
accept_header_value="application/json",
|
|
413
|
+
http_headers=http_headers,
|
|
414
|
+
security=self.sdk_configuration.security,
|
|
415
|
+
get_serialized_body=lambda: utils.serialize_request_body(
|
|
416
|
+
request, False, False, "json", models.ApproveTransferRequest
|
|
417
|
+
),
|
|
418
|
+
allow_empty_value=None,
|
|
419
|
+
timeout_ms=timeout_ms,
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
if retries == UNSET:
|
|
423
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
424
|
+
retries = self.sdk_configuration.retry_config
|
|
425
|
+
|
|
426
|
+
retry_config = None
|
|
427
|
+
if isinstance(retries, utils.RetryConfig):
|
|
428
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
429
|
+
|
|
430
|
+
http_res = await self.do_request_async(
|
|
431
|
+
hook_ctx=HookContext(
|
|
432
|
+
config=self.sdk_configuration,
|
|
433
|
+
base_url=base_url or "",
|
|
434
|
+
operation_id="v2_gas_sponsorship_approve_transfer",
|
|
435
|
+
oauth2_scopes=None,
|
|
436
|
+
security_source=self.sdk_configuration.security,
|
|
437
|
+
),
|
|
438
|
+
request=req,
|
|
439
|
+
error_status_codes=["422", "4XX", "5XX"],
|
|
440
|
+
retry_config=retry_config,
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
response_data: Any = None
|
|
444
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
445
|
+
return unmarshal_json_response(models.ApproveTransferResponse, http_res)
|
|
446
|
+
if utils.match_response(http_res, "422", "application/json"):
|
|
447
|
+
response_data = unmarshal_json_response(
|
|
448
|
+
errors.HTTPValidationErrorData, http_res
|
|
449
|
+
)
|
|
450
|
+
raise errors.HTTPValidationError(response_data, http_res)
|
|
451
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
452
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
453
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
454
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
455
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
456
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
457
|
+
|
|
458
|
+
raise errors.APIError("Unexpected response received", http_res)
|
compass_api_sdk/httpclient.py
CHANGED