Skip to content

Commit 02f6820

Browse files
add nostr balance
1 parent c8774f6 commit 02f6820

File tree

3 files changed

+67
-28
lines changed

3 files changed

+67
-28
lines changed

internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/displaywallet.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import mpos.config
44
import mpos.ui
55

6-
from wallet import LNBitsWallet
6+
from wallet import LNBitsWallet, NWCWallet
77

88
# screens:
99
main_screen = None
@@ -233,12 +233,12 @@ def janitor_cb(timer):
233233
try:
234234
wallet = LNBitsWallet(config.get_string("lnbits_url"), config.get_string("lnbits_readkey"))
235235
except Exception as e:
236-
print(f"Couldn't initialize LNBitsWallet because {e}")
236+
print(f"Couldn't initialize LNBitsWallet because: {e}")
237237
elif wallet_type == "nwc":
238238
try:
239239
wallet = NWCWallet(config.get_string("nwc_url"))
240240
except Exception as e:
241-
print("Couldn't initialize NWCWallet because {e}")
241+
print(f"Couldn't initialize NWCWallet because: {e}")
242242
else:
243243
print(f"No or unsupported wallet type configured: '{wallet_type}'")
244244

internal_filesystem/apps/com.lightningpiggy.displaywallet/assets/wallet.py

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import _thread
22
import requests
33
import json
4+
import ssl
5+
import time
6+
7+
from nostr.relay_manager import RelayManager
8+
from nostr.message_type import ClientMessageType
9+
from nostr.filter import Filter, Filters
10+
from nostr.event import EncryptedDirectMessage
11+
from nostr.key import PrivateKey
412

513
import mpos.apps
614
import mpos.time
@@ -20,6 +28,10 @@ def __str__(self):
2028
elif isinstance(self, NWCWallet):
2129
return "NWCWallet"
2230

31+
def start_refresh_balance(self):
32+
_thread.stack_size(mpos.apps.good_stack_size())
33+
_thread.start_new_thread(self.fetch_balance_thread, ())
34+
2335

2436
class LNBitsWallet(Wallet):
2537

@@ -28,11 +40,11 @@ def __init__(self, lnbits_url, lnbits_readkey):
2840
self.lnbits_url = lnbits_url
2941
self.lnbits_readkey = lnbits_readkey
3042

31-
def fetch_balance_thread(self, lnbits_url, lnbits_readkey):
43+
def fetch_balance_thread(self):
3244
print("fetch_balance_thread")
33-
walleturl = lnbits_url + "/api/v1/wallet"
45+
walleturl = self.lnbits_url + "/api/v1/wallet"
3446
headers = {
35-
"X-Api-Key": lnbits_readkey,
47+
"X-Api-Key": self.lnbits_readkey,
3648
}
3749
try:
3850
response = requests.get(walleturl, timeout=10, headers=headers)
@@ -52,27 +64,59 @@ def fetch_balance_thread(self, lnbits_url, lnbits_readkey):
5264
except Exception as e:
5365
print(f"Could not parse reponse text '{response_text}' as JSON: {e}")
5466

55-
def start_refresh_balance(self):
56-
_thread.stack_size(mpos.apps.good_stack_size())
57-
_thread.start_new_thread(self.fetch_balance_thread, (self.lnbits_url, self.lnbits_readkey))
5867

5968
class NWCWallet(Wallet):
6069

6170
def __init__(self, nwc_url):
6271
super().__init__()
6372
self.nwc_url = nwc_url
64-
nwc_data = parse_nwc_url(nwc_url)
65-
self.relay = nwc_data['relay']
66-
self.wallet_pubkey = nwc_data['pubkey']
67-
self.secret = nwc_data['secret']
68-
self.lud16 = nwc_data['lud16']
69-
print(f"DEBUG: Parsed NWC data - Relay: {relay}, Pubkey: {wallet_pubkey}, Secret: {secret}, lud16: {lud16}")
70-
# TODO: open connection to relay, subscribe to updates
73+
self.relay, self.wallet_pubkey, self.secret, self.lud16 = self.parse_nwc_url(nwc_url)
74+
self.private_key = PrivateKey(bytes.fromhex(self.secret))
75+
self.relay_manager = RelayManager()
76+
self.relay_manager.add_relay(self.relay)
77+
print(f"DEBUG: Opening relay connections")
78+
self.relay_manager.open_connections({"cert_reqs": ssl.CERT_NONE})
79+
# Set up subscription to receive response
80+
self.subscription_id = "nwc_balance_" + str(round(time.time()))
81+
#print(f"DEBUG: Setting up subscription with ID: {self.subscription_id}")
82+
self.filters = Filters([Filter(
83+
kinds=[23195], # NWC replies
84+
authors=[self.wallet_pubkey],
85+
pubkey_refs=[self.private_key.public_key.hex()]
86+
)])
87+
#print(f"DEBUG: Subscription filters: {filters.to_json_array()}")
88+
self.relay_manager.add_subscription(self.subscription_id, self.filters)
89+
time.sleep(5)
90+
7191

7292
def start_refresh_balance(self) :
73-
# TODO: make sure connected to relay (otherwise connect) and fetch balance
74-
pass
93+
# TODO: make sure connected to relay (otherwise connect)
7594

95+
# Create get_balance request
96+
balance_request = {
97+
"method": "get_balance",
98+
"params": {}
99+
}
100+
print(f"DEBUG: Created balance request: {balance_request}")
101+
102+
print(f"DEBUG: Creating encrypted DM to wallet pubkey: {self.wallet_pubkey}")
103+
dm = EncryptedDirectMessage(
104+
recipient_pubkey=self.wallet_pubkey,
105+
cleartext_content=json.dumps(balance_request)
106+
)
107+
108+
print(f"DEBUG: Signing DM {json.dumps(dm)} with private key")
109+
self.private_key.sign_event(dm) # sign also does encryption if it's a encrypted dm
110+
print(f"DEBUG: DM created with ID: {dm.id}")
111+
112+
# Publish request
113+
print(f"DEBUG: Publishing subscription request")
114+
request_message = [ClientMessageType.REQUEST, self.subscription_id]
115+
request_message.extend(self.filters.to_json_array())
116+
self.relay_manager.publish_message(json.dumps(request_message))
117+
print(f"DEBUG: Publishing encrypted DM")
118+
self.relay_manager.publish_event(dm)
119+
76120
def parse_nwc_url(self, nwc_url):
77121
"""Parse Nostr Wallet Connect URL to extract pubkey, relay, secret, and lud16."""
78122
print(f"DEBUG: Starting to parse NWC URL: {nwc_url}")
@@ -125,14 +169,9 @@ def parse_nwc_url(self, nwc_url):
125169
# Validate secret (should be 64 hex characters)
126170
if len(secret) != 64 or not all(c in '0123456789abcdef' for c in secret):
127171
raise ValueError("Invalid NWC URL: secret must be 64 hex characters")
128-
129-
return {
130-
'relay': relay,
131-
'pubkey': pubkey,
132-
'secret': secret,
133-
'lud16': lud16
134-
}
172+
173+
print(f"DEBUG: Parsed NWC data - Relay: {relay}, Pubkey: {pubkey}, Secret: {secret}, lud16: {lud16}")
174+
return relay, pubkey, secret, lud16
135175
except Exception as e:
136176
print(f"DEBUG: Error parsing NWC URL: {e}")
137-
sys.exit(1)
138177

internal_filesystem/lib/threading.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ def start(self):
1818
#stacksize = 12*1024
1919
# small stack sizes 8KB gives segfault directly
2020
# 22KB or less is too tight on desktop, 23KB and more is fine
21-
#stacksize = 24*1024
22-
stacksize = mpos.apps.good_stack_size()
21+
stacksize = 24*1024
22+
#stacksize = mpos.apps.good_stack_size() # don't depend on mpos here
2323
#stacksize = 20*1024
2424
print(f"starting thread with stacksize {stacksize}")
2525
_thread.stack_size(stacksize)

0 commit comments

Comments
 (0)