Skip to content

Commit a25cca2

Browse files
Resolve "Add the /0/private/AmendOrder and /0/private/OrderAmends endpoints"
1 parent 2c6194c commit a25cca2

File tree

5 files changed

+187
-86
lines changed

5 files changed

+187
-86
lines changed

src/kraken/spot/funding.py

Lines changed: 84 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,90 @@ def get_recent_deposits_status(
249249
extra_params=extra_params,
250250
)
251251

252+
def withdraw_methods(
253+
self: Funding,
254+
asset: str | None = None,
255+
aclass: str | None = None,
256+
network: str | None = None,
257+
*,
258+
extra_params: dict | None = None,
259+
) -> dict:
260+
"""
261+
Returns the list of available withdraw methods for that user.
262+
263+
Requires the ``Funds permissions - Query`` and ``Funds permissions -
264+
Withdraw`` API key permissions.
265+
266+
:param asset: Filter by asset
267+
:type asset: Optional[str]
268+
:param aclass: Filter by asset class (default: ``currency``)
269+
:type aclass: Optional[str]
270+
:param network: Filter by network
271+
:type network: Optional[str]
272+
:return: List of available withdraw methods
273+
:rtype: list[dict]
274+
"""
275+
params: dict = {}
276+
if defined(asset):
277+
params["asset"] = asset
278+
if defined(aclass):
279+
params["network"] = aclass
280+
if defined(network):
281+
params["network"] = network
282+
return self.request( # type: ignore[return-value]
283+
method="POST",
284+
uri="/0/private/WithdrawMethods",
285+
params=params,
286+
extra_params=extra_params,
287+
)
288+
289+
def withdraw_addresses(
290+
self: Funding,
291+
asset: str | None = None,
292+
aclass: str | None = None,
293+
method: str | None = None,
294+
key: str | None = None,
295+
verified: bool | None = None, # noqa: FBT001
296+
*,
297+
extra_params: dict | None = None,
298+
) -> dict:
299+
"""
300+
Returns the list of available withdrawal addresses for that user.
301+
302+
Requires the ``Funds permissions - Query`` and ``Funds permissions -
303+
Withdraw`` API key permissions.
304+
305+
:param asset: Filter by asset
306+
:type asset: Optional[str]
307+
:param aclass: Filter by asset class (default: ``currency``)
308+
:type aclass: Optional[str]
309+
:param method: Filter by method
310+
:type method: Optional[str]
311+
:param key: Filter by key
312+
:type key: Optional[str]
313+
:param verified: List only addresses which are confirmed via E-Mail
314+
:type verified: Optional[str]
315+
:return: List of available addresses for withdrawal
316+
:rtype: list[dict]
317+
"""
318+
params: dict = {}
319+
if defined(asset):
320+
params["asset"] = asset
321+
if defined(aclass):
322+
params["network"] = aclass
323+
if defined(method):
324+
params["method"] = method
325+
if defined(key):
326+
params["key"] = key
327+
if defined(verified):
328+
params["verified"] = verified
329+
return self.request( # type: ignore[return-value]
330+
method="POST",
331+
uri="/0/private/WithdrawMethods",
332+
params=params,
333+
extra_params=extra_params,
334+
)
335+
252336
def get_withdrawal_info(
253337
self: Funding,
254338
asset: str,
@@ -510,89 +594,5 @@ def wallet_transfer(
510594
extra_params=extra_params,
511595
)
512596

513-
def withdraw_methods(
514-
self: Funding,
515-
asset: str | None = None,
516-
aclass: str | None = None,
517-
network: str | None = None,
518-
*,
519-
extra_params: dict | None = None,
520-
) -> dict:
521-
"""
522-
Returns the list of available withdraw methods for that user.
523-
524-
Requires the ``Funds permissions - Query`` and ``Funds permissions -
525-
Withdraw`` API key permissions.
526-
527-
:param asset: Filter by asset
528-
:type asset: Optional[str]
529-
:param aclass: Filter by asset class (default: ``currency``)
530-
:type aclass: Optional[str]
531-
:param network: Filter by network
532-
:type network: Optional[str]
533-
:return: List of available withdraw methods
534-
:rtype: list[dict]
535-
"""
536-
params: dict = {}
537-
if defined(asset):
538-
params["asset"] = asset
539-
if defined(aclass):
540-
params["network"] = aclass
541-
if defined(network):
542-
params["network"] = network
543-
return self.request( # type: ignore[return-value]
544-
method="POST",
545-
uri="/0/private/WithdrawMethods",
546-
params=params,
547-
extra_params=extra_params,
548-
)
549-
550-
def withdraw_addresses(
551-
self: Funding,
552-
asset: str | None = None,
553-
aclass: str | None = None,
554-
method: str | None = None,
555-
key: str | None = None,
556-
verified: bool | None = None, # noqa: FBT001
557-
*,
558-
extra_params: dict | None = None,
559-
) -> dict:
560-
"""
561-
Returns the list of available withdrawal addresses for that user.
562-
563-
Requires the ``Funds permissions - Query`` and ``Funds permissions -
564-
Withdraw`` API key permissions.
565-
566-
:param asset: Filter by asset
567-
:type asset: Optional[str]
568-
:param aclass: Filter by asset class (default: ``currency``)
569-
:type aclass: Optional[str]
570-
:param method: Filter by method
571-
:type method: Optional[str]
572-
:param key: Filter by key
573-
:type key: Optional[str]
574-
:param verified: List only addresses which are confirmed via E-Mail
575-
:type verified: Optional[str]
576-
:return: List of available addresses for withdrawal
577-
:rtype: list[dict]
578-
"""
579-
params: dict = {}
580-
if defined(asset):
581-
params["asset"] = asset
582-
if defined(aclass):
583-
params["network"] = aclass
584-
if defined(method):
585-
params["method"] = method
586-
if defined(key):
587-
params["key"] = key
588-
if defined(verified):
589-
params["verified"] = verified
590-
return self.request( # type: ignore[return-value]
591-
method="POST",
592-
uri="/0/private/WithdrawMethods",
593-
params=params,
594-
extra_params=extra_params,
595-
)
596-
597597

598598
__all__ = ["Funding"]

src/kraken/spot/trade.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,38 @@ def create_order_batch(
470470
extra_params=extra_params,
471471
)
472472

473+
def amend_order(
474+
self: Trade,
475+
*,
476+
extra_params: dict | None = None,
477+
) -> dict:
478+
"""
479+
Amend/modify an open order.
480+
481+
Requires the ``Create and modify orders`` and ``Cancel & close orders``
482+
permissions in the API key settings.
483+
484+
- https://docs.kraken.com/api/docs/rest-api/amend-order
485+
486+
.. code-block:: python
487+
:linenos:
488+
:caption: Spot Trade: Amend order
489+
490+
>>> from kraken.spot import Trade
491+
>>> trade = Trade(key="api-key", secret="secret-key")
492+
>>> trade.amend_order(
493+
... extra_params={
494+
... "txid": "OVM3PT-56ACO-53SM2T",
495+
... "limit_price": "105636.9",
496+
... }
497+
... )
498+
"""
499+
return self.request( # type: ignore[return-value]
500+
"POST",
501+
uri="/0/private/AmendOrder",
502+
extra_params=extra_params,
503+
)
504+
473505
@ensure_string("oflags")
474506
def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
475507
self: Trade,
@@ -490,8 +522,8 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
490522
"""
491523
Edit an open order.
492524
493-
Requires the ``Create and modify orders`` permission in
494-
the API key settings.
525+
Requires the ``Create and modify orders`` permission in the API key
526+
settings.
495527
496528
- https://docs.kraken.com/api/docs/rest-api/edit-order
497529

src/kraken/spot/user.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ def get_balances(
113113
114114
Requires the ``Query funds`` permission in the API key settings.
115115
116+
- https://docs.kraken.com/api/docs/rest-api/get-extended-balance
117+
116118
:return: Dictionary containing the ``currency`` as keys, that hold a
117119
dictionary containing the ``balance`` key holding the actual balance
118120
including the value in orders and the ``hold_trade`` key that
@@ -520,6 +522,42 @@ def get_orders_info(
520522
extra_params=extra_params,
521523
)
522524

525+
def get_order_amends(
526+
self: User,
527+
order_id: str,
528+
*,
529+
extra_params: dict | None = None,
530+
) -> dict:
531+
"""
532+
Retrieve information about historical order amends.
533+
534+
Requires the ``Query open orders & trades`` and ``Query closed orders &
535+
trades`` permissions in the API key settings.
536+
537+
- https://docs.kraken.com/api/docs/rest-api/get-order-amends
538+
539+
:param order_id: The ``order_id`` to filter for.
540+
:type txid: str
541+
542+
.. code-block:: python
543+
:linenos:
544+
:caption: Spot User: Get order amends
545+
546+
>>> from kraken.spot import User
547+
>>> user = User(key="api-key", secret="secret-key")
548+
>>> user.get_order_amends(txid="OVM3PT-56ACO-53SM2T")
549+
{'amends': [], 'count': 0}
550+
"""
551+
params = {}
552+
if defined(order_id):
553+
params["order_id"] = order_id
554+
return self.request( # type: ignore[return-value]
555+
method="POST",
556+
uri="/0/private/OrderAmends",
557+
params=params,
558+
extra_params=extra_params,
559+
)
560+
523561
def get_trades_history( # pylint: disable=too-many-arguments
524562
self: User,
525563
type_: str | None = "all",

tests/spot/test_spot_trade.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,25 @@ def test_edit_order(spot_auth_trade: Trade) -> None:
190190
)
191191

192192

193+
@pytest.mark.spot
194+
@pytest.mark.spot_auth
195+
@pytest.mark.spot_trade
196+
def test_amend_order(spot_auth_trade: Trade) -> None:
197+
"""
198+
Test the ``amend_order`` function by editing an order.
199+
200+
KrakenPermissionDeniedError: since CI does not have trade permissions. If
201+
the request would be malformed, another exception could be observed.
202+
"""
203+
with pytest.raises(KrakenPermissionDeniedError):
204+
spot_auth_trade.amend_order(
205+
extra_params={
206+
"txid": "OVM3PT-56ACO-53SM2T",
207+
"limit_price": "105636.9",
208+
},
209+
)
210+
211+
193212
@pytest.mark.spot
194213
@pytest.mark.spot_auth
195214
@pytest.mark.spot_trade

tests/spot/test_spot_user.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,18 @@ def test_get_orders_info(spot_auth_user: User) -> None:
198198
sleep(2)
199199

200200

201+
@pytest.mark.spot
202+
@pytest.mark.spot_auth
203+
@pytest.mark.spot_user
204+
def test_get_order_amends(spot_auth_user: User) -> None:
205+
"""
206+
Checks the ``get_order_amends`` function by validating that the responses do
207+
not contain the error key.
208+
"""
209+
210+
assert is_not_error(spot_auth_user.get_order_amends(order_id="OVM3PT-56ACO-53SM2T"))
211+
212+
201213
@pytest.mark.spot
202214
@pytest.mark.spot_auth
203215
@pytest.mark.spot_user

0 commit comments

Comments
 (0)