diff --git a/nostr_dvm/utils/dvmconfig.py b/nostr_dvm/utils/dvmconfig.py index c698045..f4f9482 100644 --- a/nostr_dvm/utils/dvmconfig.py +++ b/nostr_dvm/utils/dvmconfig.py @@ -68,8 +68,8 @@ class DVMConfig: # More info see here: https://github.com/cashubtc/nutshell ENABLE_NUTZAP = False - NUTZAP_RELAYS = ["wss://relay.primal.net"] - NUZAP_MINTS = ["https://mint.minibits.cash/Bitcoin", "https://mint.gwoq.com"] + NUTZAP_RELAYS = ["wss://relay.nostr.net"] + NUZAP_MINTS = ["https://mint.gwoq.com"] ENABLE_AUTO_MELT = False AUTO_MELT_AMOUNT = 1000 REANNOUNCE_MINTS = True diff --git a/nostr_dvm/utils/nut_wallet_utils.py b/nostr_dvm/utils/nut_wallet_utils.py index e3f1f6b..240a47f 100644 --- a/nostr_dvm/utils/nut_wallet_utils.py +++ b/nostr_dvm/utils/nut_wallet_utils.py @@ -6,7 +6,7 @@ from datetime import timedelta import requests from nostr_sdk import Tag, Keys, nip44_encrypt, nip44_decrypt, Nip44Version, EventBuilder, Client, Filter, Kind, \ - EventId, nip04_decrypt, nip04_encrypt, Options, NostrSigner, PublicKey, Metadata + EventId, nip04_decrypt, nip04_encrypt, PublicKey, Metadata from nostr_dvm.utils.database_utils import fetch_user_metadata from nostr_dvm.utils.definitions import EventDefinitions, relay_timeout, relay_timeout_long @@ -50,13 +50,13 @@ class NutMint(object): class NutZapWallet: - async def client_connect(self, relay_list): - keys = Keys.parse(check_and_set_private_key("TEST_ACCOUNT_PK")) + async def client_connect(self, relay_list, keys): + client = Client(keys) for relay in relay_list: await client.add_relay(relay) await client.connect() - return client, keys + return client async def create_new_nut_wallet(self, mint_urls, relays, client, keys, name, description): new_nut_wallet = NutWallet() @@ -115,16 +115,16 @@ class NutZapWallet: nut_wallet = None wallet_filter = Filter().kind(EventDefinitions.KIND_NUT_WALLET).author(keys.public_key()) - wallets_struct = await client.fetch_events([wallet_filter], relay_timeout_long) - wallets = wallets_struct.to_vec() + # relay_timeout = EventSource.relays(timedelta(seconds=10)) + wallets = await client.fetch_events([wallet_filter], timedelta(seconds=10)) - if len(wallets) > 0: + if len(wallets.to_vec()) > 0: nut_wallet = NutWallet() latest = 0 best_wallet = None - for wallet_event in wallets: + for wallet_event in wallets.to_vec(): isdeleted = False for tag in wallet_event.tags().to_vec(): @@ -190,18 +190,16 @@ class NutZapWallet: # Now all proof events proof_filter = Filter().kind(Kind(7375)).author(keys.public_key()) - # relay_timeout = EventSource.relays(timedelta(seconds=5)) - proof_events_struct = await client.fetch_events([proof_filter], relay_timeout) - proof_events = proof_events_struct.to_vec() + proof_events = await client.fetch_events([proof_filter], timedelta(seconds=5)) latest_proof_sec = 0 latest_proof_event_id = EventId - for proof_event in proof_events: + for proof_event in proof_events.to_vec(): if proof_event.created_at().as_secs() > latest_proof_sec: latest_proof_sec = proof_event.created_at().as_secs() latest_proof_event_id = proof_event.id() - for proof_event in proof_events: + for proof_event in proof_events.to_vec(): try: content = nip44_decrypt(keys.secret_key(), keys.public_key(), proof_event.content()) except: @@ -445,15 +443,13 @@ class NutZapWallet: async def fetch_mint_info_event(self, pubkey, client): mint_info_filter = Filter().kind(Kind(10019)).author(PublicKey.parse(pubkey)) - # relay_timeout = EventSource.relays(timedelta(seconds=5)) - events_struct = await client.fetch_events([mint_info_filter], relay_timeout) - preferences = events_struct.to_vec() + preferences = await client.fetch_events([mint_info_filter], timedelta(seconds=5)) mints = [] relays = [] pubkey = "" - if len(preferences) > 0: - preference = preferences[0] + if len(preferences.to_vec()) > 0: + preference = preferences.to_vec()[0] for tag in preference.tags().to_vec(): if tag.as_vec()[0] == "pubkey": diff --git a/tests/nutzap_send.py b/tests/nutzap_send.py index 5bde510..998c818 100644 --- a/tests/nutzap_send.py +++ b/tests/nutzap_send.py @@ -2,7 +2,7 @@ from datetime import timedelta from pathlib import Path import dotenv -from nostr_sdk import PublicKey +from nostr_sdk import PublicKey, Keys import asyncio @@ -10,6 +10,7 @@ import argparse from nostr_dvm.utils.dvmconfig import DVMConfig +from nostr_dvm.utils.nostr_utils import check_and_set_private_key from nostr_dvm.utils.nut_wallet_utils import NutZapWallet @@ -25,7 +26,8 @@ async def test(relays, mints): nutzap_wallet = NutZapWallet() update_wallet_info = False # leave this on false except when you manually changed relays/mints/keys - client, keys = await nutzap_wallet.client_connect(relays) + keys = Keys.parse(check_and_set_private_key("TEST_ACCOUNT_PK_TEST")) + client = await nutzap_wallet.client_connect(relays, keys) set_profile = False # Attention, this overwrites your current profile if on True, do not set if you use an non-test account if set_profile: @@ -41,7 +43,7 @@ async def test(relays, mints): send_test = args.zap # Send a Nutzap send_zap_amount = 3 send_zap_message = "From my nutsack" - send_reveiver = "npub139nfkqamy53j7vce9lw6w7uwxm3a8zrwnd2m836tj5y3aytv37vqygz42j" # keys.public_key().to_bech32() # This is ourself, for testing purposes, some other people to nutzap: #npub1nxa4tywfz9nqp7z9zp7nr7d4nchhclsf58lcqt5y782rmf2hefjquaa6q8 # dbth #npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft # pablof7z + send_reveiver = "npub1dvwp6k3l4362ray6z3rk5u2va3ffstlsydqphj7ht6ca7s7kuy4syhug83" # keys.public_key().to_bech32() # This is ourself, for testing purposes, some other people to nutzap: #npub1nxa4tywfz9nqp7z9zp7nr7d4nchhclsf58lcqt5y782rmf2hefjquaa6q8 # dbth #npub1l2vyh47mk2p0qlsku7hg0vn29faehy9hy34ygaclpn66ukqp3afqutajft # pablof7z send_zapped_event = None # None, or zap an event like this: Nip19Event.from_nostr_uri("nostr:nevent1qqsxq59mhz8s6aj9jzltcmqmmv3eutsfcpkeny2x755vdu5dtq44ldqpz3mhxw309ucnydewxqhrqt338g6rsd3e9upzp75cf0tahv5z7plpdeaws7ex52nmnwgtwfr2g3m37r844evqrr6jqvzqqqqqqyqtxyr6").event_id().to_hex() # Test 3 Config: Melt to ln address diff --git a/tests/test_dvm_client.py b/tests/test_dvm_client.py index 2dace67..92acf9e 100644 --- a/tests/test_dvm_client.py +++ b/tests/test_dvm_client.py @@ -394,7 +394,7 @@ async def nostr_client_test_image_private(prompt, cashutoken): async def nostr_client(): - keys = Keys.parse(check_and_set_private_key("test_client")) + keys = Keys.parse(check_and_set_private_key("test_client5")) sk = keys.secret_key() pk = keys.public_key() print(f"Nostr Client public key: {pk.to_bech32()}, Hex: {pk.to_hex()} ") @@ -406,7 +406,7 @@ async def nostr_client(): await client.connect() dm_zap_filter = Filter().pubkey(pk).kinds([EventDefinitions.KIND_DM, - EventDefinitions.KIND_ZAP]).since( + EventDefinitions.KIND_ZAP, EventDefinitions.KIND_NIP61_NUT_ZAP]).since( Timestamp.now()) # events to us specific kinds = [EventDefinitions.KIND_NIP90_GENERIC] #SUPPORTED_KINDS = [Kind(6100), Kind(7000)] @@ -457,6 +457,16 @@ async def nostr_client(): nut_wallet.balance = 0 await nutzap_wallet.update_nut_wallet(nut_wallet, [], client, keys) nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) + else: + nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) + if nut_wallet is None: + await nutzap_wallet.create_new_nut_wallet(dvmconfig.NUZAP_MINTS, dvmconfig.NUTZAP_RELAYS, client, keys, + "Test", "My Nutsack") + nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) + if nut_wallet is not None: + await nutzap_wallet.announce_nutzap_info_event(nut_wallet, client, keys) + else: + print("Couldn't fetch wallet, please restart and see if it is there") @@ -476,20 +486,6 @@ async def nostr_client(): if tag.as_vec()[0] == "status": status = tag.as_vec()[1] # THIS IS FOR TESTING - if event.author().to_hex() == "89669b03bb25232f33192fdda77b8e36e3d3886e9b55b3c74b95091e916c8f98" and status == "payment-required" and event.created_at().as_secs() > self.last_event_time: - self.last_event_time = event.created_at().as_secs() - nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) - if nut_wallet is None: - await nutzap_wallet.create_new_nut_wallet(dvmconfig.NUZAP_MINTS, dvmconfig.NUTZAP_RELAYS, client, keys, "Test", "My Nutsack") - nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) - if nut_wallet is not None: - await nutzap_wallet.announce_nutzap_info_event(nut_wallet, client, keys) - else: - print("Couldn't fetch wallet, please restart and see if it is there") - - await nutzap_wallet.send_nut_zap(amount_sats, "From my nutsack lol", nut_wallet, event.id().to_hex(), - event.author().to_hex(), client, - keys) elif 6000 < event.kind().as_u16() < 6999: @@ -503,6 +499,17 @@ async def nostr_client(): elif event.kind().as_u16() == 9735: print("[Nostr Client]: " + f"Received new zap:") print(event.as_json()) + if event.kind().as_u16() == 9321: + print(bcolors.YELLOW + "[Client] NutZap 🥜️⚡ received" + event.as_json() + bcolors.ENDC) + + # if event.author().to_hex() == keys.public_key().to_hex(): + # #sleep to avoid event not being updated on self zap + # await asyncio.sleep(5) + + nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys) + if nut_wallet is not None: + await nutzap_wallet.reedeem_nutzap(event, nut_wallet, client, keys) + # await get_nut_wallet(client, keys) async def handle_msg(self, relay_url, msg): return