nostrdvm/tests/nutzap_send.py
2024-11-28 08:39:48 +01:00

100 lines
4.7 KiB
Python

import argparse
import asyncio
from pathlib import Path
import dotenv
from nostr_sdk import PublicKey, Keys
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
# Run with params for test functions or set the default here
parser = argparse.ArgumentParser(description='Nutzaps')
parser.add_argument("--mint", type=bool, default=False)
parser.add_argument("--zap", type=bool, default=True)
parser.add_argument("--melt", type=bool, default=False)
args = parser.parse_args()
async def test(relays, mints):
nutzap_wallet = NutZapWallet()
update_wallet_info = False # leave this on false except when you manually changed relays/mints/keys
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:
lud16 = "hype@bitcoinfixesthis.org" #overwrite with your ln address
await nutzap_wallet.set_profile("Test", "I'm a nutsack test account", lud16, "https://i.nostr.build/V4FwExrV5aXHNm70.jpg", client, keys)
# Test 1 Config: Mint Tokens
mint_to_wallet = args.mint # Test function to mint 5 sats on the mint in your list with given index below
mint_index = 0 # Index of mint in mints list to mint a token
mint_amount = 10 # Amount to mint
# Test 2 Config: Send Nutzap
send_test = args.zap # Send a Nutzap
send_zap_amount = 3
send_zap_message = "From my nutsack"
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
melt = args.melt
melt_amount = 6
print("PrivateKey: " + keys.secret_key().to_bech32() + " PublicKey: " + keys.public_key().to_bech32())
# See if we already have a wallet and fetch it
nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys)
# If we have a wallet but want to maually update the info..
if nut_wallet is not None and update_wallet_info:
await nutzap_wallet.update_nut_wallet(nut_wallet, mints, client, keys)
await nutzap_wallet.announce_nutzap_info_event(nut_wallet, client, keys)
# If we don't have a wallet, we create one, fetch it and announce our info
if nut_wallet is None:
await nutzap_wallet.create_new_nut_wallet(mints, 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")
# Test 1: We mint to our own wallet
if mint_to_wallet:
await nutzap_wallet.mint_cashu(nut_wallet, mints[mint_index], client, keys, mint_amount)
nut_wallet = await nutzap_wallet.get_nut_wallet(client, keys)
# Test 2: We send a nutzap to someone (can be ourselves)
if send_test:
zapped_event_id_hex = send_zapped_event
zapped_user_hex = PublicKey.parse(send_reveiver).to_hex()
await nutzap_wallet.send_nut_zap(send_zap_amount, send_zap_message, nut_wallet, zapped_event_id_hex, zapped_user_hex, client,
keys)
#Test 3: Melt back to lightning:
if melt:
# you can overwrite the lu16 and/or npub, otherwise it's fetched from the profile (set it once by setting set_profile to True)
lud16 = None
npub = None
await nutzap_wallet.melt_cashu(nut_wallet, mints[mint_index], melt_amount, client, keys, lud16, npub)
await nutzap_wallet.get_nut_wallet(client, keys)
if __name__ == '__main__':
env_path = Path('.env')
if env_path.is_file():
print(f'loading environment from {env_path.resolve()}')
dotenv.load_dotenv(env_path, verbose=True, override=True)
else:
raise FileNotFoundError(f'.env file not found at {env_path} ')
show_history = True
asyncio.run(test(DVMConfig().NUTZAP_RELAYS, DVMConfig().NUZAP_MINTS))