@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.
- package/CHANGELOG.md +6 -0
- package/addBitcoinInjectedWalletsExtension.cjs.js +334 -4
- package/addBitcoinInjectedWalletsExtension.esm.js +336 -6
- package/index.cjs.js +35 -0
- package/index.esm.js +35 -1
- package/injected.cjs.js +1 -0
- package/injected.esm.js +1 -0
- package/package.json +3 -3
- package/src/BitcoinWalletProvider.types.d.ts +2 -0
- package/src/BitcoinWalletProvider.types.d.ts.map +1 -1
- package/src/exports/index.d.ts +2 -1
- package/src/exports/index.d.ts.map +1 -1
- package/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.d.ts.map +1 -1
- package/src/injected/utils/phantom/createPhantomBitcoinWalletProvider/createPhantomBitcoinWalletProvider.d.ts.map +1 -1
- package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.d.ts +11 -0
- package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/createXverseBitcoinWalletProvider.d.ts.map +1 -0
- package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/index.d.ts +2 -0
- package/src/injected/utils/xverse/createXverseBitcoinWalletProvider/index.d.ts.map +1 -0
- package/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.d.ts +2 -0
- package/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.d.ts.map +1 -0
- package/src/injected/utils/xverse/getXverseInjectedProvider/index.d.ts +2 -0
- package/src/injected/utils/xverse/getXverseInjectedProvider/index.d.ts.map +1 -0
- package/src/signMessageWithCustomOptions/index.d.ts +2 -0
- package/src/signMessageWithCustomOptions/index.d.ts.map +1 -0
- package/src/signMessageWithCustomOptions/signMessageWithCustomOptions.d.ts +27 -0
- 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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs-sdk/bitcoin",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
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.
|
|
23
|
-
"@dynamic-labs-sdk/client": "0.1.0-alpha.
|
|
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"}
|
package/src/exports/index.d.ts
CHANGED
|
@@ -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"}
|
package/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addBitcoinInjectedWalletsExtension.d.ts","sourceRoot":"","sources":["../../../../../../packages/bitcoin/src/injected/addBitcoinInjectedWalletsExtension/addBitcoinInjectedWalletsExtension.ts"],"names":[],"mappings":"
|
|
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,
|
|
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 @@
|
|
|
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"}
|
package/src/injected/utils/xverse/getXverseInjectedProvider/getXverseInjectedProvider.d.ts.map
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|