`kraken`: make pps work with arbitrary deposits
Factor and fix dst <- src pair parsing into a new func `get_likely_pair()` and use throughout initial position loading; solves a parsing bug for src asset balances which aren't only 3 chars long.. a terrible assumption.kraken_deposits_fixes
parent
d690ad2bab
commit
1346c33f04
|
@ -496,9 +496,46 @@ async def trades_dialogue(
|
|||
for dst, size in balances.items():
|
||||
# we don't care about tracking positions
|
||||
# in the user's source fiat currency.
|
||||
if dst == src_fiat:
|
||||
if (
|
||||
dst == src_fiat
|
||||
or not any(
|
||||
dst in bsuid for bsuid in table.pps
|
||||
)
|
||||
):
|
||||
log.warning(
|
||||
f'Skipping balance `{dst}`:{size} for position calcs!'
|
||||
)
|
||||
continue
|
||||
|
||||
def get_likely_pair(
|
||||
dst: str,
|
||||
bsuid: str,
|
||||
src_fiat: str = src_fiat
|
||||
|
||||
) -> str:
|
||||
'''
|
||||
Attempt to get the likely trading pair masting
|
||||
a given destination asset `dst: str`.
|
||||
|
||||
'''
|
||||
try:
|
||||
src_name_start = bsuid.rindex(src_fiat)
|
||||
except (
|
||||
ValueError, # substr not found
|
||||
):
|
||||
# TODO: handle nested positions..(i.e.
|
||||
# positions where the src fiat was used to
|
||||
# buy some other dst which was furhter used
|
||||
# to buy another dst..)
|
||||
log.warning(
|
||||
f'No src fiat {src_fiat} found in {bsuid}?'
|
||||
)
|
||||
return
|
||||
|
||||
likely_dst = bsuid[:src_name_start]
|
||||
if likely_dst == dst:
|
||||
return bsuid
|
||||
|
||||
def has_pp(
|
||||
dst: str,
|
||||
size: float,
|
||||
|
@ -506,26 +543,11 @@ async def trades_dialogue(
|
|||
) -> Position | bool:
|
||||
|
||||
src2dst: dict[str, str] = {}
|
||||
|
||||
for bsuid in table.pps:
|
||||
try:
|
||||
dst_name_start = bsuid.rindex(src_fiat)
|
||||
except (
|
||||
ValueError, # substr not found
|
||||
):
|
||||
# TODO: handle nested positions..(i.e.
|
||||
# positions where the src fiat was used to
|
||||
# buy some other dst which was furhter used
|
||||
# to buy another dst..)
|
||||
log.warning(
|
||||
f'No src fiat {src_fiat} found in {bsuid}?'
|
||||
)
|
||||
continue
|
||||
|
||||
_dst = bsuid[:dst_name_start]
|
||||
if _dst != dst:
|
||||
continue
|
||||
|
||||
src2dst[src_fiat] = dst
|
||||
likely_pair = get_likely_pair(dst, bsuid)
|
||||
if likely_pair:
|
||||
src2dst[src_fiat] = dst
|
||||
|
||||
for src, dst in src2dst.items():
|
||||
pair = f'{dst}{src_fiat}'
|
||||
|
@ -578,11 +600,11 @@ async def trades_dialogue(
|
|||
# in the ``pps.toml`` for the necessary pair
|
||||
# yet and thus this likely pair grabber will
|
||||
# likely fail.
|
||||
likely_pair = {
|
||||
bsuid[:3]: bsuid
|
||||
for bsuid in table.pps
|
||||
}.get(dst)
|
||||
if not likely_pair:
|
||||
for bsuid in table.pps:
|
||||
likely_pair = get_likely_pair(dst, bsuid)
|
||||
if likely_pair:
|
||||
break
|
||||
else:
|
||||
raise ValueError(
|
||||
'Could not find a position pair in '
|
||||
'ledger for likely widthdrawal '
|
||||
|
@ -595,6 +617,8 @@ async def trades_dialogue(
|
|||
|
||||
xfer_trans = await client.get_xfers(
|
||||
dst,
|
||||
# TODO: not all src assets are
|
||||
# 3 chars long...
|
||||
src_asset=likely_pair[3:],
|
||||
)
|
||||
if xfer_trans:
|
||||
|
|
Loading…
Reference in New Issue