@dynamic-labs-sdk/bitcoin 0.1.0-alpha.20 → 0.1.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/addBitcoinInjectedWalletsExtension.cjs.js +334 -4
  3. package/addBitcoinInjectedWalletsExtension.esm.js +336 -6
  4. package/index.cjs.js +35 -0
  5. package/index.esm.js +35 -1
  6. package/injected.cjs.js +1 -0
  7. package/injected.esm.js +1 -0
  8. package/package.json +3 -3
  9. package/src/BitcoinWalletProvider.types.d.ts +2 -0
  10. package/src/BitcoinWalletProvider.types.d.ts.map +1 -1
  11. package/src/exports/index.d.ts +2 -1
  12. package/src/exports/index.d.ts.map +1 -1
  13. package/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.d.ts.map +1 -1
  14. package/src/injected/utils/phantom/createPhantomBitcoinWalletProvider/createPhantomBitcoinWalletProvider.d.ts.map +1 -1
  15. package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.d.ts +11 -0
  16. package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.d.ts.map +1 -0
  17. package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/index.d.ts +2 -0
  18. package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/index.d.ts.map +1 -0
  19. package/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.d.ts +2 -0
  20. package/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.d.ts.map +1 -0
  21. package/src/injected/utils/xverse/getXverseInjectedProvider/index.d.ts +2 -0
  22. package/src/injected/utils/xverse/getXverseInjectedProvider/index.d.ts.map +1 -0
  23. package/src/signMessageWithCustomOptions/index.d.ts +2 -0
  24. package/src/signMessageWithCustomOptions/index.d.ts.map +1 -0
  25. package/src/signMessageWithCustomOptions/signMessageWithCustomOptions.d.ts +27 -0
  26. package/src/signMessageWithCustomOptions/signMessageWithCustomOptions.d.ts.map +1 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.1.0-alpha.21 (2025-10-16)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - don't refetch project settings on page refresh if there are connected wallets ([#571](https://github.com/dynamic-labs/dynamic-sdk/pull/571))
6
+
1
7
  ## 0.1.0-alpha.20 (2025-10-15)
2
8
 
3
9
  This was a version bump only, there were no code changes.
@@ -4,9 +4,10 @@ var core = require('@dynamic-labs-sdk/client/core');
4
4
  var client = require('@dynamic-labs-sdk/client');
5
5
  var sdkApiCore = require('@dynamic-labs/sdk-api-core');
6
6
  var bitcoinjsLib = require('bitcoinjs-lib');
7
+ var satsConnect = require('sats-connect');
7
8
 
8
9
  var name = "@dynamic-labs-sdk/bitcoin";
9
- var version = "0.1.0-alpha.20";
10
+ var version = "0.1.0-alpha.21";
10
11
 
11
12
  function _extends() {
12
13
  _extends = Object.assign || function assign(target) {
@@ -100,12 +101,20 @@ const createPhantomBitcoinWalletProvider = ({ dynamicClient, injectedProvider })
100
101
  addresses: addresses.map((address)=>address.address)
101
102
  };
102
103
  };
103
- const signMessage = async ({ message, walletAccount })=>{
104
+ const signMessage = async ({ message, walletAccount, addressType })=>{
104
105
  core.assertDefined(walletAccount, 'Wallet account not found');
105
106
  await client.assertWalletAccountSigningAvailability({
106
107
  walletAccount
107
108
  }, dynamicClient);
108
- const result = await injectedProvider.signMessage(walletAccount.address, new TextEncoder().encode(message));
109
+ let addressToSignWith = walletAccount.address;
110
+ if (addressType) {
111
+ var _getWalletAccountAddressByType;
112
+ addressToSignWith = (_getWalletAccountAddressByType = client.getWalletAccountAddressByType({
113
+ type: addressType,
114
+ walletAccount
115
+ })) != null ? _getWalletAccountAddressByType : addressToSignWith;
116
+ }
117
+ const result = await injectedProvider.signMessage(addressToSignWith, new TextEncoder().encode(message));
109
118
  return {
110
119
  signature: core.getBuffer().from(result.signature).toString('base64')
111
120
  };
@@ -478,6 +487,319 @@ const getUnisatInjectedProvider = ()=>{
478
487
  return core.getInjectedProviderFromWindow(UNISAT_PROVIDER_LOCATOR);
479
488
  };
480
489
 
490
+ const convertNetworkIdForPsbt = (networkId)=>{
491
+ if (networkId === '1') {
492
+ return bitcoinjsLib.networks.bitcoin;
493
+ }
494
+ if (networkId === '2') {
495
+ return bitcoinjsLib.networks.testnet;
496
+ }
497
+ return undefined;
498
+ };
499
+
500
+ const convertNetworkIdToSatsConnectNetworkType = (networkId)=>{
501
+ if (networkId === '2') {
502
+ return satsConnect.BitcoinNetworkType.Testnet;
503
+ }
504
+ // fallback to mainnet
505
+ return satsConnect.BitcoinNetworkType.Mainnet;
506
+ };
507
+
508
+ /**
509
+ * This method will create the psbt sign options for SatsConnect for the given request
510
+ * It will validate the psbt against the signature data provided in the request
511
+ * It will return the inputs to sign if the signature data is provided
512
+ */ const getPsbtInputsToSignForSatsConnect = ({ psbt, request, isLegacySatsConnect })=>{
513
+ if (!request.signature) {
514
+ return [];
515
+ }
516
+ validatePsbt({
517
+ allowedSigHashTypes: request.allowedSighash,
518
+ psbt,
519
+ signatureData: request.signature
520
+ });
521
+ const inputsToSign = [];
522
+ for (const signature of request.signature){
523
+ var _signature_signingIndexes;
524
+ if ((_signature_signingIndexes = signature.signingIndexes) == null ? void 0 : _signature_signingIndexes.length) {
525
+ for (const index of signature.signingIndexes){
526
+ inputsToSign.push({
527
+ address: signature.address,
528
+ sigHash: isLegacySatsConnect ? getSigHashType({
529
+ input: psbt.data.inputs[index]
530
+ }) : request.allowedSighash[0],
531
+ signingIndexes: [
532
+ index
533
+ ]
534
+ });
535
+ }
536
+ }
537
+ }
538
+ return inputsToSign;
539
+ };
540
+
541
+ const getSatsConnectSigningProtocol = (protocol)=>{
542
+ if (!protocol) {
543
+ return undefined;
544
+ }
545
+ return protocol === 'ecdsa' ? satsConnect.MessageSigningProtocols.ECDSA : satsConnect.MessageSigningProtocols.BIP322;
546
+ };
547
+
548
+ const signMultipleTransactionsWithSatsConnect = async ({ network, psbts, provider })=>{
549
+ const response = await new Promise((resolve, reject)=>{
550
+ void satsConnect.signMultipleTransactions({
551
+ getProvider: ()=>Promise.resolve(provider),
552
+ onCancel: ()=>{
553
+ reject(new client.UserRejectedError({
554
+ action: 'sign psbts'
555
+ }));
556
+ },
557
+ onFinish: (response)=>{
558
+ resolve(response);
559
+ },
560
+ payload: {
561
+ message: 'Sign Psbts',
562
+ network,
563
+ psbts
564
+ }
565
+ });
566
+ });
567
+ return {
568
+ signedPsbts: response.map((response)=>response.psbtBase64)
569
+ };
570
+ };
571
+
572
+ const XVERSE_METADATA = {
573
+ displayName: 'Xverse',
574
+ icon: `${core.DYNAMIC_ICONIC_SPRITE_URL}#xverse`
575
+ };
576
+ // https://docs.xverse.app/sats-connect/wallet-methods/request-methods
577
+ const createXverseBitcoinWalletProvider = ({ dynamicClient, satsConnectProvider })=>{
578
+ const chain = 'BTC';
579
+ const walletProviderType = sdkApiCore.WalletProviderEnum.BrowserExtension;
580
+ const key = core.formatWalletProviderKey({
581
+ chain,
582
+ displayName: XVERSE_METADATA.displayName,
583
+ walletProviderType
584
+ });
585
+ const requestPermissions = async ()=>{
586
+ const response = await satsConnect.request('wallet_requestPermissions', undefined);
587
+ if (response.status === 'success') {
588
+ return;
589
+ }
590
+ throw response.error;
591
+ };
592
+ const connect = async ()=>{
593
+ // requesting permissions on initial connect will avoid
594
+ // connection prompt for other requests
595
+ await requestPermissions();
596
+ const response = await satsConnect.request('wallet_connect', null);
597
+ if (response.status !== 'success') {
598
+ throw response.error;
599
+ }
600
+ const { addresses: connectedAddresses } = response.result;
601
+ // Xverse will return other addresses/types that we don't support
602
+ // so we filter them out
603
+ const filteredAddresses = connectedAddresses.filter((address)=>address.purpose === 'ordinals' || address.purpose === 'payment');
604
+ const addresses = filteredAddresses.map((account)=>({
605
+ address: account.address,
606
+ publicKey: account.publicKey,
607
+ type: account.purpose === 'payment' ? 'payment' : 'ordinals'
608
+ }));
609
+ // put ordinals addresses first, as they should be the main walletAccount address
610
+ addresses.sort((a)=>a.type === 'ordinals' ? -1 : 1);
611
+ return {
612
+ addresses
613
+ };
614
+ };
615
+ const disconnect = async ()=>{
616
+ await satsConnect.request('wallet_renouncePermissions', null);
617
+ };
618
+ const getActiveNetworkId = async ()=>core.getActiveNetworkIdFromLastKnownRegistry({
619
+ client: dynamicClient,
620
+ walletProviderKey: key
621
+ });
622
+ const getConnectedAddresses = async ()=>{
623
+ const response = await satsConnect.request('wallet_getAccount', null);
624
+ if (response.status === 'success') {
625
+ return {
626
+ addresses: response.result.addresses.map((address)=>address.address)
627
+ };
628
+ }
629
+ if (response.error.code !== satsConnect.RpcErrorCode.ACCESS_DENIED) {
630
+ throw response.error;
631
+ }
632
+ // if error is access denied, it means that the selected account is not
633
+ // connected to the app, so return empty array
634
+ return {
635
+ addresses: []
636
+ };
637
+ };
638
+ const sendBitcoin = async ({ transaction, walletAccount })=>{
639
+ await client.assertWalletAccountSigningAvailability({
640
+ walletAccount
641
+ }, dynamicClient);
642
+ const response = await satsConnect.request('sendTransfer', {
643
+ recipients: [
644
+ {
645
+ address: transaction.recipientAddress,
646
+ amount: Number(transaction.amount)
647
+ }
648
+ ]
649
+ });
650
+ if (response.status !== 'success') {
651
+ throw response.error;
652
+ }
653
+ return {
654
+ transactionId: response.result.txid
655
+ };
656
+ };
657
+ const signMessage = async ({ message, walletAccount, protocol, addressType })=>{
658
+ core.assertDefined(walletAccount, 'Wallet account not found');
659
+ await client.assertWalletAccountSigningAvailability({
660
+ walletAccount
661
+ }, dynamicClient);
662
+ let addressToSignWith = walletAccount.address;
663
+ if (addressType) {
664
+ var _getWalletAccountAddressByType;
665
+ addressToSignWith = (_getWalletAccountAddressByType = client.getWalletAccountAddressByType({
666
+ type: addressType,
667
+ walletAccount
668
+ })) != null ? _getWalletAccountAddressByType : addressToSignWith;
669
+ }
670
+ const response = await satsConnect.request('signMessage', {
671
+ address: addressToSignWith,
672
+ message,
673
+ protocol: getSatsConnectSigningProtocol(protocol)
674
+ });
675
+ if (response.status !== 'success') {
676
+ throw response.error;
677
+ }
678
+ return {
679
+ signature: response.result.signature
680
+ };
681
+ };
682
+ const signPsbt = async ({ request, walletAccount })=>{
683
+ if (!request.allowedSighash.length) {
684
+ throw new InvalidPsbtError('allowedSighash cannot be an empty array');
685
+ }
686
+ await client.assertWalletAccountSigningAvailability({
687
+ walletAccount
688
+ }, dynamicClient);
689
+ const activeNetworkId = await getActiveNetworkId();
690
+ const network = convertNetworkIdForPsbt(activeNetworkId.networkId);
691
+ const psbtFromBase64 = bitcoinjsLib.Psbt.fromBase64(request.unsignedPsbtBase64, {
692
+ network
693
+ });
694
+ const inputsToSign = getPsbtInputsToSignForSatsConnect({
695
+ psbt: psbtFromBase64,
696
+ request
697
+ });
698
+ const signPbstPayload = {
699
+ broadcast: false,
700
+ psbt: request.unsignedPsbtBase64,
701
+ // we have to combine signing indexes for like addresses
702
+ signInputs: inputsToSign.reduce((accum, curr)=>{
703
+ if (!accum[curr.address]) {
704
+ accum[curr.address] = [];
705
+ }
706
+ accum[curr.address].push(...curr.signingIndexes);
707
+ return accum;
708
+ }, {})
709
+ };
710
+ const response = await satsConnect.request('signPsbt', signPbstPayload);
711
+ if (response.status !== 'success') {
712
+ throw response.error;
713
+ }
714
+ return {
715
+ signedPsbt: response.result.psbt
716
+ };
717
+ };
718
+ const signPsbts = async ({ requests, walletAccount })=>{
719
+ await client.assertWalletAccountSigningAvailability({
720
+ walletAccount
721
+ }, dynamicClient);
722
+ const activeNetworkId = await getActiveNetworkId();
723
+ const network = convertNetworkIdForPsbt(activeNetworkId.networkId);
724
+ const networkType = convertNetworkIdToSatsConnectNetworkType(activeNetworkId.networkId);
725
+ const psbtsToSign = [];
726
+ for (const request of requests){
727
+ const psbtFromBase64 = bitcoinjsLib.Psbt.fromBase64(request.unsignedPsbtBase64, {
728
+ network
729
+ });
730
+ const inputsToSign = getPsbtInputsToSignForSatsConnect({
731
+ psbt: psbtFromBase64,
732
+ request
733
+ });
734
+ psbtsToSign.push({
735
+ inputsToSign,
736
+ psbtBase64: request.unsignedPsbtBase64
737
+ });
738
+ }
739
+ const response = await signMultipleTransactionsWithSatsConnect({
740
+ network: {
741
+ type: networkType
742
+ },
743
+ provider: satsConnectProvider,
744
+ psbts: psbtsToSign
745
+ });
746
+ return {
747
+ signedPsbts: response.signedPsbts
748
+ };
749
+ };
750
+ const { getEventEmitter, cleanupEventEmitter } = core.createWalletProviderEventEmitter({
751
+ removeEventListeners: ({ setupReturnValue })=>{
752
+ core.assertDefined(setupReturnValue, 'Setup return value not defined');
753
+ setupReturnValue.removeAccountChangeListener();
754
+ setupReturnValue.accountDisconnectedListener();
755
+ },
756
+ setupEventListeners: ({ handleAccountsChanged, handleDisconnected })=>{
757
+ const removeAccountChangeListener = satsConnect.addListener('accountChange', ({ addresses })=>{
758
+ if (!addresses) {
759
+ return;
760
+ }
761
+ handleAccountsChanged({
762
+ addresses: addresses.map((address)=>address.address)
763
+ });
764
+ });
765
+ const accountDisconnectedListener = satsConnect.addListener('accountDisconnected', ()=>{
766
+ handleDisconnected();
767
+ });
768
+ return {
769
+ accountDisconnectedListener,
770
+ removeAccountChangeListener
771
+ };
772
+ }
773
+ });
774
+ const terminate = async ()=>{
775
+ cleanupEventEmitter();
776
+ };
777
+ return {
778
+ chain,
779
+ connect,
780
+ disconnect,
781
+ get events () {
782
+ return getEventEmitter();
783
+ },
784
+ getActiveNetworkId,
785
+ getConnectedAddresses,
786
+ groupKey: core.formatWalletProviderGroupKey(XVERSE_METADATA.displayName),
787
+ key,
788
+ metadata: XVERSE_METADATA,
789
+ sendBitcoin,
790
+ signMessage,
791
+ signPsbt,
792
+ signPsbts,
793
+ terminate,
794
+ walletProviderType
795
+ };
796
+ };
797
+
798
+ const XVERSE_BITCOIN_PROVIDER_LOCATOR = 'XverseProviders.BitcoinProvider';
799
+ const getXverseInjectedProvider = ()=>{
800
+ return core.getInjectedProviderFromWindow(XVERSE_BITCOIN_PROVIDER_LOCATOR);
801
+ };
802
+
481
803
  const BITCOIN_INJECTED_WALLETS_EXTENSION_KEY = 'bitcoinInjectedWallets';
482
804
  /**
483
805
  * Adds the Bitcoin Injected Wallets extension to the Dynamic client.
@@ -515,8 +837,16 @@ const BITCOIN_INJECTED_WALLETS_EXTENSION_KEY = 'bitcoinInjectedWallets';
515
837
  });
516
838
  injectedWalletProviders.push(phantomWalletProvider);
517
839
  }
840
+ // Create and register Xverse wallet provider
841
+ const xverseInjectedProvider = getXverseInjectedProvider();
842
+ if (xverseInjectedProvider) {
843
+ const xverseWalletProvider = createXverseBitcoinWalletProvider({
844
+ dynamicClient: client,
845
+ satsConnectProvider: xverseInjectedProvider
846
+ });
847
+ injectedWalletProviders.push(xverseWalletProvider);
848
+ }
518
849
  // TODO: create and register MagicEden wallet provider
519
- // TODO: create and register Xverse wallet provider
520
850
  // TODO: create and register OKX wallet provider
521
851
  // TODO: create and register Bitget wallet provider
522
852
  // TODO: create and register OneKey wallet provider
@@ -1,10 +1,11 @@
1
1
  import { createBaseNetworkProvider, getNetworkProviderBuilderRegistry, formatWalletProviderKey, createWalletProviderEventEmitter, DYNAMIC_ICONIC_SPRITE_URL, formatWalletProviderGroupKey, getActiveNetworkIdFromLastKnownRegistry, assertDefined, getBuffer, getInjectedProviderFromWindow, getDefaultClient, hasExtension, registerExtension, getWalletProviderRegistry, WalletProviderPriority } from '@dynamic-labs-sdk/client/core';
2
- import { assertWalletAccountSigningAvailability, BaseError } from '@dynamic-labs-sdk/client';
2
+ import { assertWalletAccountSigningAvailability, getWalletAccountAddressByType, BaseError, UserRejectedError } from '@dynamic-labs-sdk/client';
3
3
  import { WalletProviderEnum } from '@dynamic-labs/sdk-api-core';
4
- import { Psbt, payments, Transaction, address } from 'bitcoinjs-lib';
4
+ import { Psbt, payments, Transaction, address, networks } from 'bitcoinjs-lib';
5
+ import { BitcoinNetworkType, MessageSigningProtocols, signMultipleTransactions, addListener, request, RpcErrorCode } from 'sats-connect';
5
6
 
6
7
  var name = "@dynamic-labs-sdk/bitcoin";
7
- var version = "0.1.0-alpha.20";
8
+ var version = "0.1.0-alpha.21";
8
9
 
9
10
  function _extends() {
10
11
  _extends = Object.assign || function assign(target) {
@@ -98,12 +99,20 @@ const createPhantomBitcoinWalletProvider = ({ dynamicClient, injectedProvider })
98
99
  addresses: addresses.map((address)=>address.address)
99
100
  };
100
101
  };
101
- const signMessage = async ({ message, walletAccount })=>{
102
+ const signMessage = async ({ message, walletAccount, addressType })=>{
102
103
  assertDefined(walletAccount, 'Wallet account not found');
103
104
  await assertWalletAccountSigningAvailability({
104
105
  walletAccount
105
106
  }, dynamicClient);
106
- const result = await injectedProvider.signMessage(walletAccount.address, new TextEncoder().encode(message));
107
+ let addressToSignWith = walletAccount.address;
108
+ if (addressType) {
109
+ var _getWalletAccountAddressByType;
110
+ addressToSignWith = (_getWalletAccountAddressByType = getWalletAccountAddressByType({
111
+ type: addressType,
112
+ walletAccount
113
+ })) != null ? _getWalletAccountAddressByType : addressToSignWith;
114
+ }
115
+ const result = await injectedProvider.signMessage(addressToSignWith, new TextEncoder().encode(message));
107
116
  return {
108
117
  signature: getBuffer().from(result.signature).toString('base64')
109
118
  };
@@ -476,6 +485,319 @@ const getUnisatInjectedProvider = ()=>{
476
485
  return getInjectedProviderFromWindow(UNISAT_PROVIDER_LOCATOR);
477
486
  };
478
487
 
488
+ const convertNetworkIdForPsbt = (networkId)=>{
489
+ if (networkId === '1') {
490
+ return networks.bitcoin;
491
+ }
492
+ if (networkId === '2') {
493
+ return networks.testnet;
494
+ }
495
+ return undefined;
496
+ };
497
+
498
+ const convertNetworkIdToSatsConnectNetworkType = (networkId)=>{
499
+ if (networkId === '2') {
500
+ return BitcoinNetworkType.Testnet;
501
+ }
502
+ // fallback to mainnet
503
+ return BitcoinNetworkType.Mainnet;
504
+ };
505
+
506
+ /**
507
+ * This method will create the psbt sign options for SatsConnect for the given request
508
+ * It will validate the psbt against the signature data provided in the request
509
+ * It will return the inputs to sign if the signature data is provided
510
+ */ const getPsbtInputsToSignForSatsConnect = ({ psbt, request, isLegacySatsConnect })=>{
511
+ if (!request.signature) {
512
+ return [];
513
+ }
514
+ validatePsbt({
515
+ allowedSigHashTypes: request.allowedSighash,
516
+ psbt,
517
+ signatureData: request.signature
518
+ });
519
+ const inputsToSign = [];
520
+ for (const signature of request.signature){
521
+ var _signature_signingIndexes;
522
+ if ((_signature_signingIndexes = signature.signingIndexes) == null ? void 0 : _signature_signingIndexes.length) {
523
+ for (const index of signature.signingIndexes){
524
+ inputsToSign.push({
525
+ address: signature.address,
526
+ sigHash: isLegacySatsConnect ? getSigHashType({
527
+ input: psbt.data.inputs[index]
528
+ }) : request.allowedSighash[0],
529
+ signingIndexes: [
530
+ index
531
+ ]
532
+ });
533
+ }
534
+ }
535
+ }
536
+ return inputsToSign;
537
+ };
538
+
539
+ const getSatsConnectSigningProtocol = (protocol)=>{
540
+ if (!protocol) {
541
+ return undefined;
542
+ }
543
+ return protocol === 'ecdsa' ? MessageSigningProtocols.ECDSA : MessageSigningProtocols.BIP322;
544
+ };
545
+
546
+ const signMultipleTransactionsWithSatsConnect = async ({ network, psbts, provider })=>{
547
+ const response = await new Promise((resolve, reject)=>{
548
+ void signMultipleTransactions({
549
+ getProvider: ()=>Promise.resolve(provider),
550
+ onCancel: ()=>{
551
+ reject(new UserRejectedError({
552
+ action: 'sign psbts'
553
+ }));
554
+ },
555
+ onFinish: (response)=>{
556
+ resolve(response);
557
+ },
558
+ payload: {
559
+ message: 'Sign Psbts',
560
+ network,
561
+ psbts
562
+ }
563
+ });
564
+ });
565
+ return {
566
+ signedPsbts: response.map((response)=>response.psbtBase64)
567
+ };
568
+ };
569
+
570
+ const XVERSE_METADATA = {
571
+ displayName: 'Xverse',
572
+ icon: `${DYNAMIC_ICONIC_SPRITE_URL}#xverse`
573
+ };
574
+ // https://docs.xverse.app/sats-connect/wallet-methods/request-methods
575
+ const createXverseBitcoinWalletProvider = ({ dynamicClient, satsConnectProvider })=>{
576
+ const chain = 'BTC';
577
+ const walletProviderType = WalletProviderEnum.BrowserExtension;
578
+ const key = formatWalletProviderKey({
579
+ chain,
580
+ displayName: XVERSE_METADATA.displayName,
581
+ walletProviderType
582
+ });
583
+ const requestPermissions = async ()=>{
584
+ const response = await request('wallet_requestPermissions', undefined);
585
+ if (response.status === 'success') {
586
+ return;
587
+ }
588
+ throw response.error;
589
+ };
590
+ const connect = async ()=>{
591
+ // requesting permissions on initial connect will avoid
592
+ // connection prompt for other requests
593
+ await requestPermissions();
594
+ const response = await request('wallet_connect', null);
595
+ if (response.status !== 'success') {
596
+ throw response.error;
597
+ }
598
+ const { addresses: connectedAddresses } = response.result;
599
+ // Xverse will return other addresses/types that we don't support
600
+ // so we filter them out
601
+ const filteredAddresses = connectedAddresses.filter((address)=>address.purpose === 'ordinals' || address.purpose === 'payment');
602
+ const addresses = filteredAddresses.map((account)=>({
603
+ address: account.address,
604
+ publicKey: account.publicKey,
605
+ type: account.purpose === 'payment' ? 'payment' : 'ordinals'
606
+ }));
607
+ // put ordinals addresses first, as they should be the main walletAccount address
608
+ addresses.sort((a)=>a.type === 'ordinals' ? -1 : 1);
609
+ return {
610
+ addresses
611
+ };
612
+ };
613
+ const disconnect = async ()=>{
614
+ await request('wallet_renouncePermissions', null);
615
+ };
616
+ const getActiveNetworkId = async ()=>getActiveNetworkIdFromLastKnownRegistry({
617
+ client: dynamicClient,
618
+ walletProviderKey: key
619
+ });
620
+ const getConnectedAddresses = async ()=>{
621
+ const response = await request('wallet_getAccount', null);
622
+ if (response.status === 'success') {
623
+ return {
624
+ addresses: response.result.addresses.map((address)=>address.address)
625
+ };
626
+ }
627
+ if (response.error.code !== RpcErrorCode.ACCESS_DENIED) {
628
+ throw response.error;
629
+ }
630
+ // if error is access denied, it means that the selected account is not
631
+ // connected to the app, so return empty array
632
+ return {
633
+ addresses: []
634
+ };
635
+ };
636
+ const sendBitcoin = async ({ transaction, walletAccount })=>{
637
+ await assertWalletAccountSigningAvailability({
638
+ walletAccount
639
+ }, dynamicClient);
640
+ const response = await request('sendTransfer', {
641
+ recipients: [
642
+ {
643
+ address: transaction.recipientAddress,
644
+ amount: Number(transaction.amount)
645
+ }
646
+ ]
647
+ });
648
+ if (response.status !== 'success') {
649
+ throw response.error;
650
+ }
651
+ return {
652
+ transactionId: response.result.txid
653
+ };
654
+ };
655
+ const signMessage = async ({ message, walletAccount, protocol, addressType })=>{
656
+ assertDefined(walletAccount, 'Wallet account not found');
657
+ await assertWalletAccountSigningAvailability({
658
+ walletAccount
659
+ }, dynamicClient);
660
+ let addressToSignWith = walletAccount.address;
661
+ if (addressType) {
662
+ var _getWalletAccountAddressByType;
663
+ addressToSignWith = (_getWalletAccountAddressByType = getWalletAccountAddressByType({
664
+ type: addressType,
665
+ walletAccount
666
+ })) != null ? _getWalletAccountAddressByType : addressToSignWith;
667
+ }
668
+ const response = await request('signMessage', {
669
+ address: addressToSignWith,
670
+ message,
671
+ protocol: getSatsConnectSigningProtocol(protocol)
672
+ });
673
+ if (response.status !== 'success') {
674
+ throw response.error;
675
+ }
676
+ return {
677
+ signature: response.result.signature
678
+ };
679
+ };
680
+ const signPsbt = async ({ request: request$1, walletAccount })=>{
681
+ if (!request$1.allowedSighash.length) {
682
+ throw new InvalidPsbtError('allowedSighash cannot be an empty array');
683
+ }
684
+ await assertWalletAccountSigningAvailability({
685
+ walletAccount
686
+ }, dynamicClient);
687
+ const activeNetworkId = await getActiveNetworkId();
688
+ const network = convertNetworkIdForPsbt(activeNetworkId.networkId);
689
+ const psbtFromBase64 = Psbt.fromBase64(request$1.unsignedPsbtBase64, {
690
+ network
691
+ });
692
+ const inputsToSign = getPsbtInputsToSignForSatsConnect({
693
+ psbt: psbtFromBase64,
694
+ request: request$1
695
+ });
696
+ const signPbstPayload = {
697
+ broadcast: false,
698
+ psbt: request$1.unsignedPsbtBase64,
699
+ // we have to combine signing indexes for like addresses
700
+ signInputs: inputsToSign.reduce((accum, curr)=>{
701
+ if (!accum[curr.address]) {
702
+ accum[curr.address] = [];
703
+ }
704
+ accum[curr.address].push(...curr.signingIndexes);
705
+ return accum;
706
+ }, {})
707
+ };
708
+ const response = await request('signPsbt', signPbstPayload);
709
+ if (response.status !== 'success') {
710
+ throw response.error;
711
+ }
712
+ return {
713
+ signedPsbt: response.result.psbt
714
+ };
715
+ };
716
+ const signPsbts = async ({ requests, walletAccount })=>{
717
+ await assertWalletAccountSigningAvailability({
718
+ walletAccount
719
+ }, dynamicClient);
720
+ const activeNetworkId = await getActiveNetworkId();
721
+ const network = convertNetworkIdForPsbt(activeNetworkId.networkId);
722
+ const networkType = convertNetworkIdToSatsConnectNetworkType(activeNetworkId.networkId);
723
+ const psbtsToSign = [];
724
+ for (const request of requests){
725
+ const psbtFromBase64 = Psbt.fromBase64(request.unsignedPsbtBase64, {
726
+ network
727
+ });
728
+ const inputsToSign = getPsbtInputsToSignForSatsConnect({
729
+ psbt: psbtFromBase64,
730
+ request
731
+ });
732
+ psbtsToSign.push({
733
+ inputsToSign,
734
+ psbtBase64: request.unsignedPsbtBase64
735
+ });
736
+ }
737
+ const response = await signMultipleTransactionsWithSatsConnect({
738
+ network: {
739
+ type: networkType
740
+ },
741
+ provider: satsConnectProvider,
742
+ psbts: psbtsToSign
743
+ });
744
+ return {
745
+ signedPsbts: response.signedPsbts
746
+ };
747
+ };
748
+ const { getEventEmitter, cleanupEventEmitter } = createWalletProviderEventEmitter({
749
+ removeEventListeners: ({ setupReturnValue })=>{
750
+ assertDefined(setupReturnValue, 'Setup return value not defined');
751
+ setupReturnValue.removeAccountChangeListener();
752
+ setupReturnValue.accountDisconnectedListener();
753
+ },
754
+ setupEventListeners: ({ handleAccountsChanged, handleDisconnected })=>{
755
+ const removeAccountChangeListener = addListener('accountChange', ({ addresses })=>{
756
+ if (!addresses) {
757
+ return;
758
+ }
759
+ handleAccountsChanged({
760
+ addresses: addresses.map((address)=>address.address)
761
+ });
762
+ });
763
+ const accountDisconnectedListener = addListener('accountDisconnected', ()=>{
764
+ handleDisconnected();
765
+ });
766
+ return {
767
+ accountDisconnectedListener,
768
+ removeAccountChangeListener
769
+ };
770
+ }
771
+ });
772
+ const terminate = async ()=>{
773
+ cleanupEventEmitter();
774
+ };
775
+ return {
776
+ chain,
777
+ connect,
778
+ disconnect,
779
+ get events () {
780
+ return getEventEmitter();
781
+ },
782
+ getActiveNetworkId,
783
+ getConnectedAddresses,
784
+ groupKey: formatWalletProviderGroupKey(XVERSE_METADATA.displayName),
785
+ key,
786
+ metadata: XVERSE_METADATA,
787
+ sendBitcoin,
788
+ signMessage,
789
+ signPsbt,
790
+ signPsbts,
791
+ terminate,
792
+ walletProviderType
793
+ };
794
+ };
795
+
796
+ const XVERSE_BITCOIN_PROVIDER_LOCATOR = 'XverseProviders.BitcoinProvider';
797
+ const getXverseInjectedProvider = ()=>{
798
+ return getInjectedProviderFromWindow(XVERSE_BITCOIN_PROVIDER_LOCATOR);
799
+ };
800
+
479
801
  const BITCOIN_INJECTED_WALLETS_EXTENSION_KEY = 'bitcoinInjectedWallets';
480
802
  /**
481
803
  * Adds the Bitcoin Injected Wallets extension to the Dynamic client.
@@ -513,8 +835,16 @@ const BITCOIN_INJECTED_WALLETS_EXTENSION_KEY = 'bitcoinInjectedWallets';
513
835
  });
514
836
  injectedWalletProviders.push(phantomWalletProvider);
515
837
  }
838
+ // Create and register Xverse wallet provider
839
+ const xverseInjectedProvider = getXverseInjectedProvider();
840
+ if (xverseInjectedProvider) {
841
+ const xverseWalletProvider = createXverseBitcoinWalletProvider({
842
+ dynamicClient: client,
843
+ satsConnectProvider: xverseInjectedProvider
844
+ });
845
+ injectedWalletProviders.push(xverseWalletProvider);
846
+ }
516
847
  // TODO: create and register MagicEden wallet provider
517
- // TODO: create and register Xverse wallet provider
518
848
  // TODO: create and register OKX wallet provider
519
849
  // TODO: create and register Bitget wallet provider
520
850
  // TODO: create and register OneKey wallet provider
package/index.cjs.js CHANGED
@@ -6,6 +6,7 @@ var core = require('@dynamic-labs-sdk/client/core');
6
6
  var client = require('@dynamic-labs-sdk/client');
7
7
  require('@dynamic-labs/sdk-api-core');
8
8
  require('bitcoinjs-lib');
9
+ require('sats-connect');
9
10
 
10
11
  /**
11
12
  * Adds the Bitcoin extension to the Dynamic client.
@@ -115,6 +116,39 @@ class SendBitcoinRawTransactionError extends client.BaseError {
115
116
  };
116
117
  };
117
118
 
119
+ /**
120
+ * Signs a message with custom options, like a specific address type or protocol
121
+ *
122
+ * If the wallet provider does not support specifying an address type or protocol, it will use the default values.
123
+ *
124
+ * @param params.addressType - The address type to use for signing ('ordinals' or 'payment')
125
+ * @param params.message - The message to sign
126
+ * @param params.protocol - The protocol to use for signing ('ecdsa' or 'bip322-simple')
127
+ * @param params.walletAccount - The wallet account to sign the message with
128
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
129
+ * @returns An object containing the signature
130
+ * @throws {MethodNotImplementedError} If the wallet provider does not implement the signMessage method
131
+ * @throws {NotBitcoinProviderError} If the wallet account is not a valid BitcoinWalletAccount
132
+ */ const signMessageWithCustomOptions = async ({ walletAccount, message, protocol, addressType }, client$1 = client.getDefaultClient())=>{
133
+ const provider = core.getWalletProviderFromWalletAccount({
134
+ walletAccount
135
+ }, client$1);
136
+ if (!isBitcoinWalletProvider(provider)) {
137
+ throw new NotBitcoinProviderError({
138
+ providerKey: provider.key
139
+ });
140
+ }
141
+ if (!provider.signMessage) {
142
+ throw new core.MethodNotImplementedError('signMessage');
143
+ }
144
+ return provider.signMessage({
145
+ addressType,
146
+ message,
147
+ protocol,
148
+ walletAccount
149
+ });
150
+ };
151
+
118
152
  /**
119
153
  * Signs a PSBT
120
154
  * @param params.request - The request data to sign the PSBT
@@ -165,5 +199,6 @@ exports.isBitcoinNetworkProvider = isBitcoinNetworkProvider;
165
199
  exports.isBitcoinWalletAccount = isBitcoinWalletAccount;
166
200
  exports.sendBitcoin = sendBitcoin;
167
201
  exports.sendRawTransaction = sendRawTransaction;
202
+ exports.signMessageWithCustomOptions = signMessageWithCustomOptions;
168
203
  exports.signPsbt = signPsbt;
169
204
  exports.signPsbts = signPsbts;
package/index.esm.js CHANGED
@@ -5,6 +5,7 @@ import { getDefaultClient, getWalletProviderFromWalletAccount, MethodNotImplemen
5
5
  import { BaseError, getDefaultClient as getDefaultClient$1 } from '@dynamic-labs-sdk/client';
6
6
  import '@dynamic-labs/sdk-api-core';
7
7
  import 'bitcoinjs-lib';
8
+ import 'sats-connect';
8
9
 
9
10
  /**
10
11
  * Adds the Bitcoin extension to the Dynamic client.
@@ -114,6 +115,39 @@ class SendBitcoinRawTransactionError extends BaseError {
114
115
  };
115
116
  };
116
117
 
118
+ /**
119
+ * Signs a message with custom options, like a specific address type or protocol
120
+ *
121
+ * If the wallet provider does not support specifying an address type or protocol, it will use the default values.
122
+ *
123
+ * @param params.addressType - The address type to use for signing ('ordinals' or 'payment')
124
+ * @param params.message - The message to sign
125
+ * @param params.protocol - The protocol to use for signing ('ecdsa' or 'bip322-simple')
126
+ * @param params.walletAccount - The wallet account to sign the message with
127
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
128
+ * @returns An object containing the signature
129
+ * @throws {MethodNotImplementedError} If the wallet provider does not implement the signMessage method
130
+ * @throws {NotBitcoinProviderError} If the wallet account is not a valid BitcoinWalletAccount
131
+ */ const signMessageWithCustomOptions = async ({ walletAccount, message, protocol, addressType }, client = getDefaultClient$1())=>{
132
+ const provider = getWalletProviderFromWalletAccount({
133
+ walletAccount
134
+ }, client);
135
+ if (!isBitcoinWalletProvider(provider)) {
136
+ throw new NotBitcoinProviderError({
137
+ providerKey: provider.key
138
+ });
139
+ }
140
+ if (!provider.signMessage) {
141
+ throw new MethodNotImplementedError('signMessage');
142
+ }
143
+ return provider.signMessage({
144
+ addressType,
145
+ message,
146
+ protocol,
147
+ walletAccount
148
+ });
149
+ };
150
+
117
151
  /**
118
152
  * Signs a PSBT
119
153
  * @param params.request - The request data to sign the PSBT
@@ -158,4 +192,4 @@ class SendBitcoinRawTransactionError extends BaseError {
158
192
 
159
193
  assertPackageVersion(name, version);
160
194
 
161
- export { addBitcoinExtension, isBitcoinNetworkProvider, isBitcoinWalletAccount, sendBitcoin, sendRawTransaction, signPsbt, signPsbts };
195
+ export { addBitcoinExtension, isBitcoinNetworkProvider, isBitcoinWalletAccount, sendBitcoin, sendRawTransaction, signMessageWithCustomOptions, signPsbt, signPsbts };
package/injected.cjs.js CHANGED
@@ -6,6 +6,7 @@ require('@dynamic-labs-sdk/client/core');
6
6
  require('@dynamic-labs-sdk/client');
7
7
  require('@dynamic-labs/sdk-api-core');
8
8
  require('bitcoinjs-lib');
9
+ require('sats-connect');
9
10
 
10
11
  assertPackageVersion.assertPackageVersion(addBitcoinInjectedWalletsExtension.name, addBitcoinInjectedWalletsExtension.version);
11
12
 
package/injected.esm.js CHANGED
@@ -5,5 +5,6 @@ import '@dynamic-labs-sdk/client/core';
5
5
  import '@dynamic-labs-sdk/client';
6
6
  import '@dynamic-labs/sdk-api-core';
7
7
  import 'bitcoinjs-lib';
8
+ import 'sats-connect';
8
9
 
9
10
  assertPackageVersion(name, version);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs-sdk/bitcoin",
3
- "version": "0.1.0-alpha.20",
3
+ "version": "0.1.0-alpha.21",
4
4
  "type": "module",
5
5
  "main": "./index.cjs.js",
6
6
  "module": "./index.esm.js",
@@ -19,8 +19,8 @@
19
19
  }
20
20
  },
21
21
  "dependencies": {
22
- "@dynamic-labs-sdk/assert-package-version": "0.1.0-alpha.20",
23
- "@dynamic-labs-sdk/client": "0.1.0-alpha.20",
22
+ "@dynamic-labs-sdk/assert-package-version": "0.1.0-alpha.21",
23
+ "@dynamic-labs-sdk/client": "0.1.0-alpha.21",
24
24
  "@dynamic-labs/sdk-api-core": "0.0.805",
25
25
  "bitcoinjs-lib": "7.0.0",
26
26
  "sats-connect": "4.1.1"
@@ -31,6 +31,7 @@ export type BitcoinTransaction = {
31
31
  amount: bigint;
32
32
  recipientAddress: string;
33
33
  };
34
+ export type BitcoinAddressType = 'ordinals' | 'payment';
34
35
  export type BitcoinSignProtocol = 'ecdsa' | 'bip322-simple';
35
36
  export type BitcoinWalletProvider = Omit<WalletProvider, 'signMessage'> & {
36
37
  chain: 'BTC';
@@ -39,6 +40,7 @@ export type BitcoinWalletProvider = Omit<WalletProvider, 'signMessage'> & {
39
40
  walletAccount: BitcoinWalletAccount;
40
41
  }) => Promise<BitcoinSendTransactionResponse>;
41
42
  signMessage: (args: {
43
+ addressType?: BitcoinAddressType;
42
44
  message: string;
43
45
  protocol?: BitcoinSignProtocol;
44
46
  walletAccount?: WalletAccount;
@@ -1 +1 @@
1
- {"version":3,"file":"BitcoinWalletProvider.types.d.ts","sourceRoot":"","sources":["../../../../packages/bitcoin/src/BitcoinWalletProvider.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,+BAA+B,EAAE,CAAC;IAC9C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;QACnC,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,eAAe,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG;IACxE,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,kBAAkB,CAAC;QAChC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,IAAI,EAAE;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;QAC/B,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,OAAO,EAAE,sBAAsB,CAAC;QAChC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtC,SAAS,EAAE,CAAC,IAAI,EAAE;QAChB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;QACnC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC1C,CAAC"}
1
+ {"version":3,"file":"BitcoinWalletProvider.types.d.ts","sourceRoot":"","sources":["../../../../packages/bitcoin/src/BitcoinWalletProvider.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,+BAA+B,EAAE,CAAC;IAC9C,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,wBAAwB,CAAC,EAAE,OAAO,CAAC;QACnC,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,eAAe,CAAC;AAE5D,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG;IACxE,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;QACnB,WAAW,EAAE,kBAAkB,CAAC;QAChC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,IAAI,EAAE;QAClB,WAAW,CAAC,EAAE,kBAAkB,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;QAC/B,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,OAAO,EAAE,sBAAsB,CAAC;QAChC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtC,SAAS,EAAE,CAAC,IAAI,EAAE;QAChB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;QACnC,aAAa,EAAE,oBAAoB,CAAC;KACrC,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC1C,CAAC"}
@@ -1,12 +1,13 @@
1
1
  export { addBitcoinExtension } from '../addBitcoinExtension';
2
2
  export type { BitcoinNetworkProvider } from '../BitcoinNetworkProvider.types';
3
3
  export type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';
4
- export type { BitcoinSendTransactionResponse, BitcoinSignPsbtRequest, BitcoinTransaction, } from '../BitcoinWalletProvider.types';
4
+ export type { BitcoinAddressType, BitcoinSendTransactionResponse, BitcoinSignProtocol, BitcoinSignPsbtRequest, BitcoinTransaction, } from '../BitcoinWalletProvider.types';
5
5
  export { InvalidPsbtError } from '../errors/InvalidPsbtError';
6
6
  export { isBitcoinNetworkProvider } from '../isBitcoinNetworkProvider';
7
7
  export { isBitcoinWalletAccount } from '../isBitcoinWalletAccount';
8
8
  export { sendBitcoin } from '../sendBitcoin';
9
9
  export { sendRawTransaction } from '../sendRawTransaction';
10
+ export { signMessageWithCustomOptions } from '../signMessageWithCustomOptions';
10
11
  export { signPsbt } from '../signPsbt';
11
12
  export { signPsbts } from '../signPsbts';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/bitcoin/src/exports/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,YAAY,EACV,8BAA8B,EAC9B,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/bitcoin/src/exports/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,YAAY,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"addBitcoinInjectedWalletsExtension.d.ts","sourceRoot":"","sources":["../../../../../../packages/bitcoin/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,sCAAsC,2BAA2B,CAAC;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,oBAE5C,IAwDF,CAAC"}
1
+ {"version":3,"file":"addBitcoinInjectedWalletsExtension.d.ts","sourceRoot":"","sources":["../../../../../../packages/bitcoin/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,sCAAsC,2BAA2B,CAAC;AAE/E;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,oBAE5C,IAiEF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPhantomBitcoinWalletProvider.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/phantom/createPhantomBitcoinWalletProvider/createPhantomBitcoinWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAE5B,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAE9F,eAAO,MAAM,gBAAgB,EAAE,sBAG9B,CAAC;AAEF,KAAK,wCAAwC,GAAG;IAC9C,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,8BAA8B,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,kCAAkC,yCAG5C,wCAAwC,KAAG,qBA0J7C,CAAC"}
1
+ {"version":3,"file":"createPhantomBitcoinWalletProvider.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/phantom/createPhantomBitcoinWalletProvider/createPhantomBitcoinWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAG5B,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAE9F,eAAO,MAAM,gBAAgB,EAAE,sBAG9B,CAAC;AAEF,KAAK,wCAAwC,GAAG;IAC9C,aAAa,EAAE,aAAa,CAAC;IAC7B,gBAAgB,EAAE,8BAA8B,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,kCAAkC,yCAG5C,wCAAwC,KAAG,qBAoK7C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type DynamicClient, type WalletProviderMetadata } from '@dynamic-labs-sdk/client';
2
+ import type { BitcoinProvider } from 'sats-connect';
3
+ import type { BitcoinWalletProvider } from '../../../../BitcoinWalletProvider.types';
4
+ export declare const XVERSE_METADATA: WalletProviderMetadata;
5
+ type CreateXverseBitcoinWalletProviderParams = {
6
+ dynamicClient: DynamicClient;
7
+ satsConnectProvider: BitcoinProvider;
8
+ };
9
+ export declare const createXverseBitcoinWalletProvider: ({ dynamicClient, satsConnectProvider, }: CreateXverseBitcoinWalletProviderParams) => BitcoinWalletProvider;
10
+ export {};
11
+ //# sourceMappingURL=createXverseBitcoinWalletProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createXverseBitcoinWalletProvider.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAG5B,MAAM,0BAA0B,CAAC;AAYlC,OAAO,KAAK,EAEV,eAAe,EAGhB,MAAM,cAAc,CAAC;AAOtB,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAQjD,eAAO,MAAM,eAAe,EAAE,sBAG7B,CAAC;AAEF,KAAK,uCAAuC,GAAG;IAC7C,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,eAAe,CAAC;CACtC,CAAC;AAGF,eAAO,MAAM,iCAAiC,4CAG3C,uCAAuC,KAAG,qBA4T5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { createXverseBitcoinWalletProvider } from './createXverseBitcoinWalletProvider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/xverse/createXverseBitcoinWalletProvider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const getXverseInjectedProvider: () => any;
2
+ //# sourceMappingURL=getXverseInjectedProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getXverseInjectedProvider.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,yBAAyB,WAIrC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { getXverseInjectedProvider } from './getXverseInjectedProvider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/bitcoin/src/injected/utils/xverse/getXverseInjectedProvider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { signMessageWithCustomOptions } from './signMessageWithCustomOptions';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/bitcoin/src/signMessageWithCustomOptions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { BitcoinWalletAccount } from '../BitcoinWalletAccount.types';
2
+ import type { BitcoinAddressType, BitcoinSignProtocol } from '../BitcoinWalletProvider.types';
3
+ type SignMessageWithCustomOptionsParams = {
4
+ addressType?: BitcoinAddressType;
5
+ message: string;
6
+ protocol?: BitcoinSignProtocol;
7
+ walletAccount: BitcoinWalletAccount;
8
+ };
9
+ /**
10
+ * Signs a message with custom options, like a specific address type or protocol
11
+ *
12
+ * If the wallet provider does not support specifying an address type or protocol, it will use the default values.
13
+ *
14
+ * @param params.addressType - The address type to use for signing ('ordinals' or 'payment')
15
+ * @param params.message - The message to sign
16
+ * @param params.protocol - The protocol to use for signing ('ecdsa' or 'bip322-simple')
17
+ * @param params.walletAccount - The wallet account to sign the message with
18
+ * @param [client] - The Dynamic client instance. Only required when using multiple Dynamic clients.
19
+ * @returns An object containing the signature
20
+ * @throws {MethodNotImplementedError} If the wallet provider does not implement the signMessage method
21
+ * @throws {NotBitcoinProviderError} If the wallet account is not a valid BitcoinWalletAccount
22
+ */
23
+ export declare const signMessageWithCustomOptions: ({ walletAccount, message, protocol, addressType, }: SignMessageWithCustomOptionsParams, client?: any) => Promise<{
24
+ signature: string;
25
+ }>;
26
+ export {};
27
+ //# sourceMappingURL=signMessageWithCustomOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signMessageWithCustomOptions.d.ts","sourceRoot":"","sources":["../../../../../packages/bitcoin/src/signMessageWithCustomOptions/signMessageWithCustomOptions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AAIxC,KAAK,kCAAkC,GAAG;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,aAAa,EAAE,oBAAoB,CAAC;CACrC,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,uDAMpC,kCAAkC,mBAEpC,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAsB/B,CAAC"}