Skip to content

Commit 592b217

Browse files
Fix get_trade_volume crash on list-of-object pair values (#466)
1 parent 3c69476 commit 592b217

1 file changed

Lines changed: 38 additions & 7 deletions

File tree

‎src/kraken/spot/user.py‎

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import warnings
1717
from decimal import Decimal
18-
from typing import Self
18+
from typing import Self, cast
1919

2020
from kraken.base_api import SpotClient, defined, ensure_string
2121

@@ -911,10 +911,9 @@ def get_ledgers(
911911
extra_params=extra_params,
912912
)
913913

914-
@ensure_string("pair")
915914
def get_trade_volume(
916915
self: User,
917-
pair: str | list[str] | None = None,
916+
pair: str | list[str] | list[dict[str, str]] | None = None,
918917
*,
919918
fee_info: bool | None = None,
920919
fee_schedule: bool | None = None,
@@ -927,9 +926,11 @@ def get_trade_volume(
927926
928927
- https://docs.kraken.com/api/docs/rest-api/get-trade-volume
929928
930-
:param pair: Asset pair, list of asset pairs or comma delimited list (as
931-
string) of asset pairs to filter
932-
:type pair: str | list[str], optional
929+
:param pair: Asset pair, list of asset pairs, or comma delimited list
930+
(as string) of asset pairs to filter. For non-forex asset classes
931+
(e.g., ``derivatives``, ``equity_pair``), pass a list of
932+
``{"asset": ..., "aclass": ...}`` objects instead.
933+
:type pair: str | list[str] | list[dict[str, str]], optional
933934
:param fee_info: Deprecated and without effect (default: ``None``).
934935
Kraken now derives fee inclusion from ``pair`` alone and treats
935936
this as a legacy no-op parameter. Passing it emits a
@@ -1002,6 +1003,24 @@ def get_trade_volume(
10021003
}
10031004
]
10041005
}
1006+
>>> u.get_trade_volume(
1007+
... pair=[{"asset": "PF_XBTUSD", "aclass": "derivatives"}],
1008+
... )
1009+
{
1010+
'currency': 'ZUSD',
1011+
'volume': '212243.1210',
1012+
'fees': {
1013+
'PF_XBTUSD': {
1014+
'fee': '0.2200',
1015+
'minfee': '0.1000',
1016+
'maxfee': '0.2200',
1017+
'nextfee': '0.2000',
1018+
'tiervolume': '0.0000',
1019+
'nextvolume': '250000.0000'
1020+
}
1021+
},
1022+
'fees_maker': {...}
1023+
}
10051024
10061025
"""
10071026
if defined(fee_info):
@@ -1014,8 +1033,19 @@ def get_trade_volume(
10141033
stacklevel=3,
10151034
)
10161035
params: dict = {}
1036+
# A list of {"asset": ..., "aclass": ...} objects is required to
1037+
# request fees for non-forex classes (e.g., derivatives, equity_pair)
1038+
# and must be sent as a JSON body rather than joined into a string.
1039+
pair_is_objects = (
1040+
isinstance(pair, list) and bool(pair) and isinstance(pair[0], dict)
1041+
)
10171042
if defined(pair):
1018-
params["pair"] = pair
1043+
if pair_is_objects:
1044+
params["pair"] = pair
1045+
elif isinstance(pair, list):
1046+
params["pair"] = ",".join(cast("list[str]", pair))
1047+
else:
1048+
params["pair"] = pair
10191049
if defined(fee_schedule):
10201050
# Kraken validates this parameter strictly against the JSON
10211051
# boolean literals "true"/"false" and rejects the default
@@ -1026,6 +1056,7 @@ def get_trade_volume(
10261056
method="POST",
10271057
uri="/0/private/TradeVolume",
10281058
params=params,
1059+
do_json=pair_is_objects,
10291060
extra_params=extra_params,
10301061
)
10311062

0 commit comments

Comments
 (0)