Skip to content

Commit

Permalink
feat: update to v1.0.0 (#42)
Browse files Browse the repository at this point in the history
* feat: update to v1.0.0
* vue3
* fix rc5
  • Loading branch information
dni authored Oct 30, 2024
1 parent 2b14deb commit 1b98fac
Show file tree
Hide file tree
Showing 15 changed files with 1,448 additions and 1,362 deletions.
18 changes: 10 additions & 8 deletions boltz_client/onchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@ def validate_address(address: str, network: str, pair: str) -> str:
address = _address_unconfidential
_address = _address_unconfidential
else:
if network == "testnet":
network = "test"
net = NETWORKS[network]
_address = address
try:
addr = script.Script.from_address(_address) or script.Script()
if addr.address(net) != address:
raise ValueError(f"Invalid network {network}")
return address
except EmbitError as exc:
raise ValueError(f"Invalid address: {exc}") from exc

_address = address
addr = script.Script.from_address(_address) or script.Script()
if addr.address(net) != address:
raise ValueError(f"Invalid network {network}")
return address


def create_preimage() -> tuple[str, str]:
Expand All @@ -44,6 +44,8 @@ def create_key_pair(network, pair) -> tuple[str, str]:
if pair == "L-BTC/BTC":
net = LNETWORKS[network]
else:
if network == "testnet":
network = "test"
net = NETWORKS[network]

privkey = ec.PrivateKey(os.urandom(32), True, net)
Expand Down
158 changes: 63 additions & 95 deletions crud.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from datetime import datetime
from typing import List, Optional, Union
from typing import Optional, Union

from lnbits.db import Database
from lnbits.helpers import insert_query, update_query, urlsafe_short_hash
from lnbits.helpers import urlsafe_short_hash
from loguru import logger

from .boltz_client.boltz import BoltzReverseSwapResponse, BoltzSwapResponse
Expand All @@ -19,31 +19,29 @@
db = Database("ext_boltz")


async def get_submarine_swaps(wallet_ids: Union[str, List[str]]) -> List[SubmarineSwap]:
async def get_submarine_swaps(wallet_ids: Union[str, list[str]]) -> list[SubmarineSwap]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]

q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])
return await db.fetchall(
f"SELECT * FROM boltz.submarineswap WHERE wallet IN ({q}) order by time DESC",
(*wallet_ids,),
model=SubmarineSwap,
)

return [SubmarineSwap(**row) for row in rows]


async def get_all_pending_submarine_swaps() -> List[SubmarineSwap]:
rows = await db.fetchall(
async def get_all_pending_submarine_swaps() -> list[SubmarineSwap]:
return await db.fetchall(
"SELECT * FROM boltz.submarineswap WHERE status='pending' order by time DESC",
)
return [SubmarineSwap(**row) for row in rows]


async def get_submarine_swap(swap_id) -> Optional[SubmarineSwap]:
row = await db.fetchone(
"SELECT * FROM boltz.submarineswap WHERE id = ?", (swap_id,)
return await db.fetchone(
"SELECT * FROM boltz.submarineswap WHERE id = :id",
{"id": swap_id},
SubmarineSwap,
)
return SubmarineSwap(**row) if row else None


async def create_submarine_swap(
Expand All @@ -70,47 +68,40 @@ async def create_submarine_swap(
**data.dict(),
)

await db.execute(
insert_query("boltz.submarineswap", swap),
(*swap.dict().values(),),
)
new_swap = await get_submarine_swap(swap_id)
assert new_swap, "Newly created swap not found in database"
return new_swap
await db.insert("boltz.submarineswap", swap)
return swap


async def get_reverse_submarine_swaps(
wallet_ids: Union[str, List[str]]
) -> List[ReverseSubmarineSwap]:
wallet_ids: Union[str, list[str]]
) -> list[ReverseSubmarineSwap]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]

q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])
return await db.fetchall(
f"""
SELECT * FROM boltz.reverse_submarineswap
WHERE wallet IN ({q}) order by time DESC
SELECT * FROM boltz.reverse_submarineswap
WHERE wallet IN ({q}) order by time DESC
""",
(*wallet_ids,),
model=ReverseSubmarineSwap,
)

return [ReverseSubmarineSwap(**row) for row in rows]


async def get_all_pending_reverse_submarine_swaps() -> List[ReverseSubmarineSwap]:
rows = await db.fetchall(
async def get_all_pending_reverse_submarine_swaps() -> list[ReverseSubmarineSwap]:
return await db.fetchall(
"SELECT * FROM boltz.reverse_submarineswap "
"WHERE status='pending' order by time DESC"
"WHERE status='pending' order by time DESC",
model=ReverseSubmarineSwap,
)

return [ReverseSubmarineSwap(**row) for row in rows]


async def get_reverse_submarine_swap(swap_id) -> Optional[ReverseSubmarineSwap]:
row = await db.fetchone(
"SELECT * FROM boltz.reverse_submarineswap WHERE id = ?", (swap_id,)
return await db.fetchone(
"SELECT * FROM boltz.reverse_submarineswap WHERE id = :id",
{"id": swap_id},
ReverseSubmarineSwap,
)
return ReverseSubmarineSwap(**row) if row else None


async def create_reverse_submarine_swap(
Expand All @@ -135,45 +126,41 @@ async def create_reverse_submarine_swap(
blinding_key=swap.blindingKey,
**data.dict(),
)
await db.execute(
insert_query("boltz.reverse_submarineswap", reverse_swap),
(*reverse_swap.dict().values(),),
)
new_swap = await get_reverse_submarine_swap(swap_id)
assert new_swap, "Newly created swap not found in database"
return new_swap
await db.insert("boltz.reverse_submarineswap", reverse_swap)
return reverse_swap


async def get_auto_reverse_submarine_swaps(
wallet_ids: List[str],
) -> List[AutoReverseSubmarineSwap]:
q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
wallet_ids: list[str],
) -> list[AutoReverseSubmarineSwap]:
q = ",".join([f"'{wallet_id}'" for wallet_id in wallet_ids])
return await db.fetchall(
f"""
SELECT * FROM boltz.auto_reverse_submarineswap
WHERE wallet IN ({q}) order by time DESC
SELECT * FROM boltz.auto_reverse_submarineswap
WHERE wallet IN ({q}) order by time DESC
""",
(*wallet_ids,),
model=AutoReverseSubmarineSwap,
)
return [AutoReverseSubmarineSwap(**row) for row in rows]


async def get_auto_reverse_submarine_swap(
swap_id,
) -> Optional[AutoReverseSubmarineSwap]:
row = await db.fetchone(
"SELECT * FROM boltz.auto_reverse_submarineswap WHERE id = ?", (swap_id,)
return await db.fetchone(
"SELECT * FROM boltz.auto_reverse_submarineswap WHERE id = :id",
{"id": swap_id},
AutoReverseSubmarineSwap,
)
return AutoReverseSubmarineSwap(**row) if row else None


async def get_auto_reverse_submarine_swap_by_wallet(
wallet_id,
) -> Optional[AutoReverseSubmarineSwap]:
row = await db.fetchone(
"SELECT * FROM boltz.auto_reverse_submarineswap WHERE wallet = ?", (wallet_id,)
return await db.fetchone(
"SELECT * FROM boltz.auto_reverse_submarineswap WHERE wallet = :wallet",
{"wallet": wallet_id},
AutoReverseSubmarineSwap,
)
return AutoReverseSubmarineSwap(**row) if row else None


async def create_auto_reverse_submarine_swap(
Expand All @@ -183,28 +170,20 @@ async def create_auto_reverse_submarine_swap(
swap = AutoReverseSubmarineSwap(
id=swap_id, time=datetime.now(), count=0, **create_swap.dict()
)
await db.execute(
insert_query("boltz.auto_reverse_submarineswap", swap),
(*swap.dict().values(),),
)
new_swap = await get_auto_reverse_submarine_swap(swap_id)
assert new_swap, "Newly created swap not found in database"
return new_swap
await db.insert("boltz.auto_reverse_submarineswap", swap)
return swap


async def update_auto_swap_count(swap_id: str, count: int):
await db.execute(
"UPDATE boltz.auto_reverse_submarineswap SET count = ? WHERE id = ?",
(
count,
swap_id,
),
"UPDATE boltz.auto_reverse_submarineswap SET count = :count WHERE id = :id",
{"id": swap_id, "count": count},
)


async def delete_auto_reverse_submarine_swap(swap_id):
await db.execute(
"DELETE FROM boltz.auto_reverse_submarineswap WHERE id = ?", (swap_id,)
"DELETE FROM boltz.auto_reverse_submarineswap WHERE id = :id", {"id": swap_id}
)


Expand All @@ -213,11 +192,8 @@ async def update_swap_status(swap_id: str, status: str):
swap = await get_submarine_swap(swap_id)
if swap:
await db.execute(
"UPDATE boltz.submarineswap SET status = ? WHERE id = ?",
(
status,
swap.id,
),
"UPDATE boltz.submarineswap SET status = :status WHERE id = :id",
{"status": status, "id": swap_id},
)
logger.info(
f"Boltz - swap status change: {status}. "
Expand All @@ -228,11 +204,8 @@ async def update_swap_status(swap_id: str, status: str):
reverse_swap = await get_reverse_submarine_swap(swap_id)
if reverse_swap:
await db.execute(
"UPDATE boltz.reverse_submarineswap SET status = ? WHERE id = ?",
(
status,
reverse_swap.id,
),
"UPDATE boltz.reverse_submarineswap SET status = :status WHERE id = :id",
{"status": status, "id": swap_id},
)
logger.info(
f"Boltz - reverse swap status change: {status}. "
Expand All @@ -244,23 +217,18 @@ async def update_swap_status(swap_id: str, status: str):


async def get_or_create_boltz_settings() -> BoltzSettings:
row = await db.fetchone("SELECT * FROM boltz.settings LIMIT 1")
if row:
return BoltzSettings(**row)
else:
settings = BoltzSettings()
await db.execute(
insert_query("boltz.settings", settings), (*settings.dict().values(),)
)
settings = await db.fetchone(
"SELECT * FROM boltz.settings LIMIT 1", model=BoltzSettings
)
if settings:
return settings
settings = BoltzSettings()
await db.insert("boltz.settings", settings)
return settings


async def update_boltz_settings(settings: BoltzSettings) -> BoltzSettings:
await db.execute(
# 3rd arguments `WHERE clause` is empty for settings
update_query("boltz.settings", settings, ""),
(*settings.dict().values(),),
)
await db.update("boltz.settings", settings, "")
return settings


Expand Down
24 changes: 12 additions & 12 deletions models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from datetime import datetime
from datetime import datetime, timezone
from typing import Optional

from fastapi import Query
from pydantic import BaseModel
from pydantic import BaseModel, Field


class BoltzSettings(BaseModel):
Expand All @@ -18,9 +18,9 @@ class SubmarineSwap(BaseModel):
amount: int
direction: str
feerate: bool
feerate_value: Optional[int]
feerate_value: Optional[int] = None
payment_hash: str
time: datetime
time: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
status: str
refund_privkey: str
refund_address: str
Expand All @@ -30,7 +30,7 @@ class SubmarineSwap(BaseModel):
address: str
bip21: str
redeem_script: str
blinding_key: Optional[str]
blinding_key: Optional[str] = None


class CreateSubmarineSwap(BaseModel):
Expand All @@ -39,7 +39,7 @@ class CreateSubmarineSwap(BaseModel):
refund_address: str = Query(...)
amount: int = Query(...)
direction: str = Query("receive")
feerate: bool = Query(...)
feerate: bool = Query(None)
feerate_value: Optional[int] = Query(None)


Expand All @@ -50,10 +50,10 @@ class ReverseSubmarineSwap(BaseModel):
amount: int
direction: str
feerate: bool
feerate_value: Optional[int]
feerate_value: Optional[int] = None
onchain_address: str
instant_settlement: bool
time: datetime
time: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
status: str
boltz_id: str
preimage: str
Expand All @@ -63,7 +63,7 @@ class ReverseSubmarineSwap(BaseModel):
onchain_amount: int
timeout_block_height: int
redeem_script: str
blinding_key: Optional[str]
blinding_key: Optional[str] = None


class CreateReverseSubmarineSwap(BaseModel):
Expand All @@ -73,7 +73,7 @@ class CreateReverseSubmarineSwap(BaseModel):
direction: str = Query("send")
instant_settlement: bool = Query(...)
onchain_address: str = Query(...)
feerate: bool = Query(...)
feerate: bool = Query(None)
feerate_value: Optional[int] = Query(None)


Expand All @@ -82,11 +82,11 @@ class AutoReverseSubmarineSwap(BaseModel):
wallet: str
asset: str
amount: int
feerate_limit: Optional[int]
feerate_limit: Optional[int] = None
balance: int
onchain_address: str
instant_settlement: bool
time: datetime
time: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
count: int


Expand Down
Loading

0 comments on commit 1b98fac

Please sign in to comment.