nip47 0.5.1+2 copy "nip47: ^0.5.1+2" to clipboard
nip47: ^0.5.1+2 copied to clipboard

This package implements the Nostr Wallet Connect protocol as described in the NIP-47.

example/nip47_example.dart

import 'dart:developer';

import 'package:nip01/nip01.dart';
import 'package:nip01/nip01.dart' as nip01;
import 'package:nip47/nip47.dart';

Future<void> main() async {
  // Initialize nip01 dependencies
  final relayDataSource = nip01.WebSocketRelayDataSource();
  final relayRepository =
      nip01.RelayRepositoryImpl(relayDataSource: relayDataSource);
  final eventRepository =
      nip01.EventRepositoryImpl(relayDataSource: relayDataSource);
  final subscriptionRepository =
      nip01.SubscriptionRepositoryImpl(relayDataSource: relayDataSource);
  final publishEventUseCase = nip01.PublishEventUseCase(
      eventRepository: eventRepository, relayRepository: relayRepository);
  final subscribeUseCase = nip01.SubscribeUseCase(
      subscriptionRepository: subscriptionRepository,
      eventRepository: eventRepository,
      relayRepository: relayRepository);
  final unsubscribeUseCase =
      nip01.UnsubscribeUseCase(subscriptionRepository: subscriptionRepository);

  // Initialize NIP-47 database
  final nip47Database = Nip47Database();
  // Initialize datasources
  final nostrDataSource = NostrDataSourceImpl(
    publishEventUseCase: publishEventUseCase,
    subscribeUseCase: subscribeUseCase,
    unsubscribeUseCase: unsubscribeUseCase,
  );
  final localRequestDataSource =
      SqliteLocalRequestDataSource(database: nip47Database);
  final localResponseDataSource =
      SqliteLocalResponseDataSource(database: nip47Database);
  // Initialize repositories
  final walletConnectionRepository = WalletConnectionRepositoryImpl(
    localWalletConnectionDataSource:
        SqliteLocalWalletConnectionDataSource(database: nip47Database),
  );
  final infoEventRepository = InfoEventRepositoryImpl(
    nostrDataSource: nostrDataSource,
  );
  final requestRepository = RequestRepositoryImpl(
    nostrDataSource: nostrDataSource,
    localRequestDataSource: localRequestDataSource,
    localWalletConnectionDataSource:
        SqliteLocalWalletConnectionDataSource(database: nip47Database),
  );
  final responseRepository = ResponseRepositoryImpl(
    nostrDataSource: nostrDataSource,
    localResponseDataSource: localResponseDataSource,
    localWalletConnectionDataSource:
        SqliteLocalWalletConnectionDataSource(database: nip47Database),
  );
  // Initialize use cases
  final createWalletConnectionUseCase = CreateWalletConnectionUseCase(
    walletConnectionRepository: walletConnectionRepository,
    infoEventRepository: infoEventRepository,
    requestRepository: requestRepository,
  );
  final getRequestEventStreamUseCase = GetRequestEventStreamUseCase(
    requestRepository: requestRepository,
  );
  final sendResponseUseCase = SendResponseUseCase(
    responseRepository: responseRepository,
  );

  // Choose a dedicated relay for a connection
  const relayUrl = 'wss://nwclay.paywithflash.com';

  // Generate key pairs for wallet services
  final walletServiceKeyPair = KeyPair.generate();
  log('Wallet service pubkey: ${walletServiceKeyPair.publicKey}');
  final walletServiceKeyPair2 = KeyPair.generate();
  log('Wallet service pubkey2: ${walletServiceKeyPair2.publicKey}');

  final methods = [
    Method.getInfo,
    Method.getBalance,
    Method.listTransactions,
  ];
  final customMethods = ['make_liquid_address', 'pay_liquid'];

  // Add a new connection
  final connectionUri = await createWalletConnectionUseCase.execute(
    walletServiceKeyPair: walletServiceKeyPair,
    relays: [Uri.parse(relayUrl)],
    methods: methods,
    customMethods: customMethods,
  );
  log('Connection created: ${connectionUri.clientPubkey}');
  print('Connection URI: ${connectionUri.uri}');

  // Listen for nwc requests
  final sub = getRequestEventStreamUseCase.execute().listen((event) async {
    print('Request event: $event');
    switch (event.request) {
      case GetBalanceRequest request:
        try {
          final response = Response.getBalance(
              requestId: event.eventId,
              clientPubkey: request.clientPubkey,
              balanceSat: 10101);
          await sendResponseUseCase.execute(
            response,
            walletServicePrivateKey: walletServiceKeyPair.privateKey,
            waitForOkMessage: false,
          );
        } catch (e) {
          print('Error responding to GetBalanceRequest: $e');
        }
      case GetInfoRequest request:
        try {
          final response = Response.getInfo(
            requestId: event.eventId,
            clientPubkey: request.clientPubkey,
            alias: 'Dartstr Wallet',
            color: '#FF0000',
            network: Network.mainnet,
            methods: methods,
          );
          await sendResponseUseCase.execute(
            response,
            walletServicePrivateKey: walletServiceKeyPair.privateKey,
            waitForOkMessage: false,
          );
        } catch (e) {
          print('Error responding to GetInfoRequest: $e');
        }
      default:
        print('TODO: handle other requests');
    }
  });

  Future.delayed(Duration(minutes: 10), () {
    sub.cancel();
  });
}
2
likes
140
points
10
downloads

Publisher

verified publisherkumuly.dev

Weekly Downloads

This package implements the Nostr Wallet Connect protocol as described in the NIP-47.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

bolt11_decoder, dartstr_utils, decimal, drift, freezed_annotation, intl, json_annotation, nip01, nip04, sqlite3

More

Packages that depend on nip47