2
2
from typing import Optional
3
3
4
4
from lnbits .db import Database
5
- from lnbits .helpers import urlsafe_short_hash
5
+ from lnbits .helpers import insert_query , update_query , urlsafe_short_hash
6
6
7
7
from .helpers import derive_address
8
8
from .models import Address , Config , WalletAccount
9
9
10
10
db = Database ("ext_watchonly" )
11
11
12
12
13
- async def create_watch_wallet (user : str , w : WalletAccount ) -> WalletAccount :
14
- wallet_id = urlsafe_short_hash ()
13
+ async def create_watch_wallet (wallet : WalletAccount ) -> WalletAccount :
15
14
await db .execute (
16
- """
17
- INSERT INTO watchonly.wallets (
18
- id,
19
- "user",
20
- masterpub,
21
- fingerprint,
22
- title,
23
- type,
24
- address_no,
25
- balance,
26
- network,
27
- meta
28
- )
29
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
30
- """ ,
31
- (
32
- wallet_id ,
33
- user ,
34
- w .masterpub ,
35
- w .fingerprint ,
36
- w .title ,
37
- w .type ,
38
- w .address_no ,
39
- w .balance ,
40
- w .network ,
41
- w .meta ,
42
- ),
15
+ insert_query ("watchonly.wallets" , wallet ),
16
+ wallet .dict (),
43
17
)
44
- wallet = await get_watch_wallet (wallet_id )
45
- assert wallet
46
18
return wallet
47
19
48
20
49
21
async def get_watch_wallet (wallet_id : str ) -> Optional [WalletAccount ]:
50
22
row = await db .fetchone (
51
- "SELECT * FROM watchonly.wallets WHERE id = ?" , (wallet_id ,)
23
+ "SELECT * FROM watchonly.wallets WHERE id = :id" ,
24
+ {"id" : wallet_id },
52
25
)
53
- return WalletAccount . from_row ( row ) if row else None
26
+ return WalletAccount ( ** row ) if row else None
54
27
55
28
56
29
async def get_watch_wallets (user : str , network : str ) -> list [WalletAccount ]:
57
30
rows = await db .fetchall (
58
- """SELECT * FROM watchonly.wallets WHERE "user" = ? AND network = ?""" ,
59
- (user , network ),
31
+ """
32
+ SELECT * FROM watchonly.wallets
33
+ WHERE "user" = :user AND network = :network
34
+ """ ,
35
+ {"user" : user , "network" : network },
60
36
)
61
37
return [WalletAccount (** row ) for row in rows ]
62
38
63
39
64
- async def update_watch_wallet (wallet_id : str , ** kwargs ) -> Optional [WalletAccount ]:
65
- q = ", " .join ([f"{ field [0 ]} = ?" for field in kwargs .items ()])
66
-
40
+ async def update_watch_wallet (wallet : WalletAccount ) -> WalletAccount :
67
41
await db .execute (
68
- f"UPDATE watchonly.wallets SET { q } WHERE id = ?" , (* kwargs .values (), wallet_id )
42
+ update_query ("watchonly.wallets" , wallet ),
43
+ wallet .dict (),
69
44
)
70
- row = await db .fetchone (
71
- "SELECT * FROM watchonly.wallets WHERE id = ?" , (wallet_id ,)
72
- )
73
- return WalletAccount .from_row (row ) if row else None
45
+ return wallet
74
46
75
47
76
48
async def delete_watch_wallet (wallet_id : str ) -> None :
77
- await db .execute ("DELETE FROM watchonly.wallets WHERE id = ?" , ( wallet_id ,))
78
-
79
-
80
- ########################ADDRESSES#######################
49
+ await db .execute (
50
+ "DELETE FROM watchonly.wallets WHERE id = :id" ,
51
+ { "id" : wallet_id },
52
+ )
81
53
82
54
83
55
async def get_fresh_address (wallet_id : str ) -> Optional [Address ]:
@@ -110,7 +82,8 @@ async def get_fresh_address(wallet_id: str) -> Optional[Address]:
110
82
)
111
83
address = addresses .pop ()
112
84
113
- await update_watch_wallet (wallet_id , ** {"address_no" : address_index + 1 })
85
+ wallet .address_no = address_index + 1
86
+ await update_watch_wallet (wallet )
114
87
115
88
return address
116
89
@@ -132,41 +105,55 @@ async def create_fresh_addresses(
132
105
133
106
for address_index in range (start_address_index , end_address_index ):
134
107
address = await derive_address (wallet .masterpub , address_index , branch_index )
108
+ assert address # TODO: why optional
109
+
110
+ addr = Address (
111
+ id = urlsafe_short_hash (),
112
+ address = address ,
113
+ wallet = wallet_id ,
114
+ branch_index = branch_index ,
115
+ address_index = address_index ,
116
+ )
135
117
136
118
await db .execute (
137
- """
138
- INSERT INTO watchonly.addresses (
139
- id,
140
- address,
141
- wallet,
142
- amount,
143
- branch_index,
144
- address_index
145
- )
146
- VALUES (?, ?, ?, ?, ?, ?)
147
- """ ,
148
- (urlsafe_short_hash (), address , wallet_id , 0 , branch_index , address_index ),
119
+ insert_query ("watchonly.addresses" , addr ),
120
+ addr .dict (),
149
121
)
150
122
151
123
# return fresh addresses
152
124
rows = await db .fetchall (
153
125
"""
154
- SELECT * FROM watchonly.addresses
155
- WHERE wallet = ? AND branch_index = ?
156
- AND address_index >= ? AND address_index < ?
126
+ SELECT * FROM watchonly.addresses WHERE wallet = :wallet
127
+ AND branch_index = :branch_index
128
+ AND address_index >= :start_address_index
129
+ AND address_index < :end_address_index
157
130
ORDER BY branch_index, address_index
158
131
""" ,
159
- (wallet_id , branch_index , start_address_index , end_address_index ),
132
+ {
133
+ "wallet" : wallet_id ,
134
+ "branch_index" : branch_index ,
135
+ "start_address_index" : start_address_index ,
136
+ "end_address_index" : end_address_index ,
137
+ },
160
138
)
161
139
162
140
return [Address (** row ) for row in rows ]
163
141
164
142
165
143
async def get_address (address : str ) -> Optional [Address ]:
166
144
row = await db .fetchone (
167
- "SELECT * FROM watchonly.addresses WHERE address = ?" , (address ,)
145
+ "SELECT * FROM watchonly.addresses WHERE address = :address" ,
146
+ {"address" : address },
147
+ )
148
+ return Address (** row ) if row else None
149
+
150
+
151
+ async def get_address_by_id (address_id : str ) -> Optional [Address ]:
152
+ row = await db .fetchone (
153
+ "SELECT * FROM watchonly.addresses WHERE id = :id" ,
154
+ {"id" : address_id },
168
155
)
169
- return Address . from_row ( row ) if row else None
156
+ return Address ( ** row ) if row else None
170
157
171
158
172
159
async def get_address_at_index (
@@ -175,75 +162,75 @@ async def get_address_at_index(
175
162
row = await db .fetchone (
176
163
"""
177
164
SELECT * FROM watchonly.addresses
178
- WHERE wallet = ? AND branch_index = ? AND address_index = ?
165
+ WHERE wallet = :wallet AND branch_index = :branch_index
166
+ AND address_index = :address_index
179
167
""" ,
180
- (
181
- wallet_id ,
182
- branch_index ,
183
- address_index ,
184
- ) ,
168
+ {
169
+ "wallet" : wallet_id ,
170
+ "branch_index" : branch_index ,
171
+ "address_index" : address_index ,
172
+ } ,
185
173
)
186
- return Address . from_row ( row ) if row else None
174
+ return Address ( ** row ) if row else None
187
175
188
176
189
177
async def get_addresses (wallet_id : str ) -> list [Address ]:
190
178
rows = await db .fetchall (
191
179
"""
192
- SELECT * FROM watchonly.addresses WHERE wallet = ?
193
- ORDER BY branch_index, address_index
180
+ SELECT * FROM watchonly.addresses WHERE wallet = :wallet
181
+ ORDER BY branch_index, address_index
194
182
""" ,
195
- ( wallet_id ,) ,
183
+ { "wallet" : wallet_id } ,
196
184
)
197
185
198
186
return [Address (** row ) for row in rows ]
199
187
200
188
201
- async def update_address (address_id : str , ** kwargs ) -> Address :
202
- q = ", " .join ([f"{ field [0 ]} = ?" for field in kwargs .items ()])
203
-
189
+ async def update_address (address : Address ) -> Address :
204
190
await db .execute (
205
- f"""UPDATE watchonly.addresses SET { q } WHERE id = ? """ ,
206
- (* kwargs .values (), address_id ),
207
- )
208
- row = await db .fetchone (
209
- "SELECT * FROM watchonly.addresses WHERE id = ?" , (address_id ,)
191
+ update_query ("watchonly.addresses" , address ),
192
+ address .dict (),
210
193
)
211
- assert row , "updated address not found"
212
- return Address .from_row (row )
194
+ return address
213
195
214
196
215
197
async def delete_addresses_for_wallet (wallet_id : str ) -> None :
216
- await db .execute ("DELETE FROM watchonly.addresses WHERE wallet = ?" , (wallet_id ,))
198
+ await db .execute (
199
+ "DELETE FROM watchonly.addresses WHERE wallet = :wallet" , {"wallet" : wallet_id }
200
+ )
217
201
218
202
219
203
async def create_config (user : str ) -> Config :
220
204
config = Config ()
221
205
await db .execute (
222
206
"""
223
207
INSERT INTO watchonly.config ("user", json_data)
224
- VALUES (?, ? )
208
+ VALUES (:user, :data )
225
209
""" ,
226
- ( user , json .dumps (config .dict ())) ,
210
+ { " user" : user , "data" : json .dumps (config .dict ())} ,
227
211
)
228
212
row = await db .fetchone (
229
- """SELECT json_data FROM watchonly.config WHERE "user" = ?""" , (user ,)
213
+ """SELECT json_data FROM watchonly.config WHERE "user" = :user""" ,
214
+ {"user" : user },
230
215
)
231
216
return json .loads (row [0 ], object_hook = lambda d : Config (** d ))
232
217
233
218
234
- async def update_config (config : Config , user : str ) -> Optional [ Config ] :
219
+ async def update_config (config : Config , user : str ) -> Config :
235
220
await db .execute (
236
- """UPDATE watchonly.config SET json_data = ? WHERE "user" = ? """ ,
237
- ( json .dumps (config .dict ()), user ) ,
221
+ """UPDATE watchonly.config SET json_data = :data WHERE "user" = :user """ ,
222
+ { "data" : json .dumps (config .dict ()), " user" : user } ,
238
223
)
239
224
row = await db .fetchone (
240
- """SELECT json_data FROM watchonly.config WHERE "user" = ?""" , (user ,)
225
+ """SELECT json_data FROM watchonly.config WHERE "user" = :user""" ,
226
+ {"user" : user },
241
227
)
242
228
return json .loads (row [0 ], object_hook = lambda d : Config (** d ))
243
229
244
230
245
231
async def get_config (user : str ) -> Optional [Config ]:
246
232
row = await db .fetchone (
247
- """SELECT json_data FROM watchonly.config WHERE "user" = ?""" , (user ,)
233
+ """SELECT json_data FROM watchonly.config WHERE "user" = :user""" ,
234
+ {"user" : user },
248
235
)
249
236
return json .loads (row [0 ], object_hook = lambda d : Config (** d )) if row else None
0 commit comments