@reown/appkit-adapter-bitcoin 1.6.1-rc.0
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/LICENSE +190 -0
- package/dist/esm/exports/index.js +2 -0
- package/dist/esm/exports/index.js.map +1 -0
- package/dist/esm/src/adapter.js +220 -0
- package/dist/esm/src/adapter.js.map +1 -0
- package/dist/esm/src/connectors/LeatherConnector.js +63 -0
- package/dist/esm/src/connectors/LeatherConnector.js.map +1 -0
- package/dist/esm/src/connectors/OKXConnector.js +101 -0
- package/dist/esm/src/connectors/OKXConnector.js.map +1 -0
- package/dist/esm/src/connectors/SatsConnectConnector.js +123 -0
- package/dist/esm/src/connectors/SatsConnectConnector.js.map +1 -0
- package/dist/esm/src/connectors/WalletStandardConnector.js +159 -0
- package/dist/esm/src/connectors/WalletStandardConnector.js.map +1 -0
- package/dist/esm/src/errors/MethodNotSupportedError.js +11 -0
- package/dist/esm/src/errors/MethodNotSupportedError.js.map +1 -0
- package/dist/esm/src/index.js +3 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/utils/BitcoinApi.js +13 -0
- package/dist/esm/src/utils/BitcoinApi.js.map +1 -0
- package/dist/esm/src/utils/BitcoinConnector.js +2 -0
- package/dist/esm/src/utils/BitcoinConnector.js.map +1 -0
- package/dist/esm/src/utils/ProviderEventEmitter.js +28 -0
- package/dist/esm/src/utils/ProviderEventEmitter.js.map +1 -0
- package/dist/esm/src/utils/UnitsUtil.js +10 -0
- package/dist/esm/src/utils/UnitsUtil.js.map +1 -0
- package/dist/esm/src/utils/WalletConnectProvider.js +115 -0
- package/dist/esm/src/utils/WalletConnectProvider.js.map +1 -0
- package/dist/esm/src/utils/wallet-standard/SignMessage.js +7 -0
- package/dist/esm/src/utils/wallet-standard/SignMessage.js.map +1 -0
- package/dist/esm/src/utils/wallet-standard/SignTransaction.js +7 -0
- package/dist/esm/src/utils/wallet-standard/SignTransaction.js.map +1 -0
- package/dist/esm/src/utils/wallet-standard/WalletFeatures.js +2 -0
- package/dist/esm/src/utils/wallet-standard/WalletFeatures.js.map +1 -0
- package/dist/esm/tests/BitcoinAdapter.test.js +96 -0
- package/dist/esm/tests/BitcoinAdapter.test.js.map +1 -0
- package/dist/esm/tests/connectors/LeatherConnector.test.js +138 -0
- package/dist/esm/tests/connectors/LeatherConnector.test.js.map +1 -0
- package/dist/esm/tests/connectors/OKXConnector.test.js +157 -0
- package/dist/esm/tests/connectors/OKXConnector.test.js.map +1 -0
- package/dist/esm/tests/connectors/SatsConnectConnector.test.js +238 -0
- package/dist/esm/tests/connectors/SatsConnectConnector.test.js.map +1 -0
- package/dist/esm/tests/connectors/WalletStandardConnector.test.js +296 -0
- package/dist/esm/tests/connectors/WalletStandardConnector.test.js.map +1 -0
- package/dist/esm/tests/mocks/mockSatsConnect.js +60 -0
- package/dist/esm/tests/mocks/mockSatsConnect.js.map +1 -0
- package/dist/esm/tests/mocks/mockUTXO.js +15 -0
- package/dist/esm/tests/mocks/mockUTXO.js.map +1 -0
- package/dist/esm/tests/mocks/mockUniversalProvider.js +54 -0
- package/dist/esm/tests/mocks/mockUniversalProvider.js.map +1 -0
- package/dist/esm/tests/mocks/mockWalletStandard.js +47 -0
- package/dist/esm/tests/mocks/mockWalletStandard.js.map +1 -0
- package/dist/esm/tests/utils/BitcoinApi.test.js +48 -0
- package/dist/esm/tests/utils/BitcoinApi.test.js.map +1 -0
- package/dist/esm/tests/utils/UnitsUtils.test.js +21 -0
- package/dist/esm/tests/utils/UnitsUtils.test.js.map +1 -0
- package/dist/esm/tests/utils/WalletConnectProvider.test.js +268 -0
- package/dist/esm/tests/utils/WalletConnectProvider.test.js.map +1 -0
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/types/exports/index.d.ts +1 -0
- package/dist/types/src/adapter.d.ts +36 -0
- package/dist/types/src/connectors/LeatherConnector.d.ts +23 -0
- package/dist/types/src/connectors/OKXConnector.d.ts +59 -0
- package/dist/types/src/connectors/SatsConnectConnector.d.ts +42 -0
- package/dist/types/src/connectors/WalletStandardConnector.d.ts +39 -0
- package/dist/types/src/errors/MethodNotSupportedError.d.ts +6 -0
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/utils/BitcoinApi.d.ts +22 -0
- package/dist/types/src/utils/BitcoinConnector.d.ts +85 -0
- package/dist/types/src/utils/ProviderEventEmitter.d.ts +11 -0
- package/dist/types/src/utils/UnitsUtil.d.ts +4 -0
- package/dist/types/src/utils/WalletConnectProvider.d.ts +90 -0
- package/dist/types/src/utils/wallet-standard/SignMessage.d.ts +64 -0
- package/dist/types/src/utils/wallet-standard/SignTransaction.d.ts +72 -0
- package/dist/types/src/utils/wallet-standard/WalletFeatures.d.ts +9 -0
- package/dist/types/tests/BitcoinAdapter.test.d.ts +1 -0
- package/dist/types/tests/connectors/LeatherConnector.test.d.ts +1 -0
- package/dist/types/tests/connectors/OKXConnector.test.d.ts +1 -0
- package/dist/types/tests/connectors/SatsConnectConnector.test.d.ts +1 -0
- package/dist/types/tests/connectors/WalletStandardConnector.test.d.ts +1 -0
- package/dist/types/tests/mocks/mockSatsConnect.d.ts +22 -0
- package/dist/types/tests/mocks/mockUTXO.d.ts +2 -0
- package/dist/types/tests/mocks/mockUniversalProvider.d.ts +6 -0
- package/dist/types/tests/mocks/mockWalletStandard.d.ts +7 -0
- package/dist/types/tests/utils/BitcoinApi.test.d.ts +1 -0
- package/dist/types/tests/utils/UnitsUtils.test.d.ts +1 -0
- package/dist/types/tests/utils/WalletConnectProvider.test.d.ts +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { AddressPurpose, getProviders, getProviderById } from 'sats-connect';
|
|
2
|
+
import { ProviderEventEmitter } from '../utils/ProviderEventEmitter.js';
|
|
3
|
+
export class SatsConnectConnector extends ProviderEventEmitter {
|
|
4
|
+
constructor({ provider, requestedChains, getActiveNetwork }) {
|
|
5
|
+
super();
|
|
6
|
+
this.chain = 'bip122';
|
|
7
|
+
this.type = 'ANNOUNCED';
|
|
8
|
+
this.requestedChains = [];
|
|
9
|
+
this.walletUnsubscribes = [];
|
|
10
|
+
this.wallet = provider;
|
|
11
|
+
this.requestedChains = requestedChains;
|
|
12
|
+
this.provider = this;
|
|
13
|
+
this.getActiveNetwork = getActiveNetwork;
|
|
14
|
+
}
|
|
15
|
+
get id() {
|
|
16
|
+
return this.name;
|
|
17
|
+
}
|
|
18
|
+
get name() {
|
|
19
|
+
return this.wallet.name;
|
|
20
|
+
}
|
|
21
|
+
get imageUrl() {
|
|
22
|
+
return this.wallet.icon;
|
|
23
|
+
}
|
|
24
|
+
get chains() {
|
|
25
|
+
return this.requestedChains.filter(chain => chain.chainNamespace === 'bip122');
|
|
26
|
+
}
|
|
27
|
+
async request(args) {
|
|
28
|
+
return this.internalRequest(args.method, args.params);
|
|
29
|
+
}
|
|
30
|
+
async connect() {
|
|
31
|
+
const address = await this.getAccountAddresses()
|
|
32
|
+
.then(addresses => addresses[0]?.address)
|
|
33
|
+
.catch(() => this.internalRequest('wallet_connect', null).then(response => response?.addresses?.find(a => a?.purpose === AddressPurpose.Payment)?.address));
|
|
34
|
+
if (!address) {
|
|
35
|
+
throw new Error('No address available');
|
|
36
|
+
}
|
|
37
|
+
this.bindEvents();
|
|
38
|
+
return address;
|
|
39
|
+
}
|
|
40
|
+
async disconnect() {
|
|
41
|
+
await this.internalRequest('wallet_disconnect', null);
|
|
42
|
+
this.unbindEvents();
|
|
43
|
+
}
|
|
44
|
+
async getAccountAddresses() {
|
|
45
|
+
const response = await this.internalRequest('getAddresses', {
|
|
46
|
+
purposes: [AddressPurpose.Payment, AddressPurpose.Ordinals, AddressPurpose.Stacks],
|
|
47
|
+
message: 'Connect to your wallet'
|
|
48
|
+
});
|
|
49
|
+
if (response.addresses.length === 0) {
|
|
50
|
+
throw new Error('No address available');
|
|
51
|
+
}
|
|
52
|
+
return response.addresses;
|
|
53
|
+
}
|
|
54
|
+
static getWallets({ requestedChains, getActiveNetwork }) {
|
|
55
|
+
const providers = getProviders();
|
|
56
|
+
return providers.map(provider => new SatsConnectConnector({ provider, requestedChains, getActiveNetwork }));
|
|
57
|
+
}
|
|
58
|
+
async signMessage(params) {
|
|
59
|
+
const res = await this.internalRequest('signMessage', params);
|
|
60
|
+
return res.signature;
|
|
61
|
+
}
|
|
62
|
+
async signPSBT(params) {
|
|
63
|
+
const signInputs = params.signInputs.reduce((acc, input) => {
|
|
64
|
+
const currentIndexes = acc[input.address] || [];
|
|
65
|
+
currentIndexes.push(input.index);
|
|
66
|
+
return { ...acc, [input.address]: currentIndexes };
|
|
67
|
+
}, {});
|
|
68
|
+
const res = await this.internalRequest('signPsbt', {
|
|
69
|
+
psbt: params.psbt,
|
|
70
|
+
broadcast: params.broadcast,
|
|
71
|
+
signInputs
|
|
72
|
+
});
|
|
73
|
+
return res;
|
|
74
|
+
}
|
|
75
|
+
async sendTransfer({ amount, recipient }) {
|
|
76
|
+
const parsedAmount = Number(amount);
|
|
77
|
+
if (isNaN(parsedAmount)) {
|
|
78
|
+
throw new Error('Invalid amount');
|
|
79
|
+
}
|
|
80
|
+
const res = await this.internalRequest('sendTransfer', {
|
|
81
|
+
recipients: [{ address: recipient, amount: parsedAmount }]
|
|
82
|
+
});
|
|
83
|
+
return res.txid;
|
|
84
|
+
}
|
|
85
|
+
getWalletProvider() {
|
|
86
|
+
return getProviderById(this.wallet.id);
|
|
87
|
+
}
|
|
88
|
+
async internalRequest(method, options) {
|
|
89
|
+
const response = await this.getWalletProvider()
|
|
90
|
+
.request(method, options)
|
|
91
|
+
.catch(error => {
|
|
92
|
+
if ('jsonrpc' in error && 'error' in error) {
|
|
93
|
+
return error;
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
});
|
|
97
|
+
if ('result' in response) {
|
|
98
|
+
return response.result;
|
|
99
|
+
}
|
|
100
|
+
throw { ...response.error, name: 'RPCError' };
|
|
101
|
+
}
|
|
102
|
+
bindEvents() {
|
|
103
|
+
this.unbindEvents();
|
|
104
|
+
const provider = this.getWalletProvider();
|
|
105
|
+
if (typeof provider.addListener !== 'function') {
|
|
106
|
+
console.warn(`SatsConnectConnector:bindEvents - wallet provider "${this.name}" does not support events`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.walletUnsubscribes.push(provider.addListener('accountChange', async (_data) => {
|
|
110
|
+
const address = await this.connect();
|
|
111
|
+
this.emit('accountsChanged', [address]);
|
|
112
|
+
}), provider.addListener('disconnect', _data => {
|
|
113
|
+
this.emit('disconnect');
|
|
114
|
+
}), provider.addListener('networkChange', _data => {
|
|
115
|
+
this.emit('chainChanged', this.chains);
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
unbindEvents() {
|
|
119
|
+
this.walletUnsubscribes.forEach(unsubscribe => unsubscribe());
|
|
120
|
+
this.walletUnsubscribes = [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=SatsConnectConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SatsConnectConnector.js","sourceRoot":"","sources":["../../../../src/connectors/SatsConnectConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { getWallets } from '@wallet-standard/app';
|
|
2
|
+
import { ProviderEventEmitter } from '../utils/ProviderEventEmitter.js';
|
|
3
|
+
import { MethodNotSupportedError } from '../errors/MethodNotSupportedError.js';
|
|
4
|
+
import { bitcoin, bitcoinTestnet } from '@reown/appkit/networks';
|
|
5
|
+
export class WalletStandardConnector extends ProviderEventEmitter {
|
|
6
|
+
constructor({ wallet, requestedChains }) {
|
|
7
|
+
super();
|
|
8
|
+
this.chain = 'bip122';
|
|
9
|
+
this.type = 'ANNOUNCED';
|
|
10
|
+
this.requestedChains = [];
|
|
11
|
+
this.walletUnsubscribes = [];
|
|
12
|
+
this.provider = this;
|
|
13
|
+
this.wallet = wallet;
|
|
14
|
+
this.requestedChains = requestedChains;
|
|
15
|
+
this.provider = this;
|
|
16
|
+
}
|
|
17
|
+
get id() {
|
|
18
|
+
return this.name;
|
|
19
|
+
}
|
|
20
|
+
get name() {
|
|
21
|
+
return this.wallet.name;
|
|
22
|
+
}
|
|
23
|
+
get imageUrl() {
|
|
24
|
+
return this.wallet.icon;
|
|
25
|
+
}
|
|
26
|
+
get chains() {
|
|
27
|
+
return this.wallet.chains
|
|
28
|
+
.map(chainId => this.requestedChains.find(chain => {
|
|
29
|
+
switch (chainId) {
|
|
30
|
+
case 'bitcoin:mainnet':
|
|
31
|
+
return chain.caipNetworkId === bitcoin.caipNetworkId;
|
|
32
|
+
case 'bitcoin:testnet':
|
|
33
|
+
return chain.caipNetworkId === bitcoinTestnet.caipNetworkId;
|
|
34
|
+
default:
|
|
35
|
+
return chain.caipNetworkId === chainId;
|
|
36
|
+
}
|
|
37
|
+
}))
|
|
38
|
+
.filter(Boolean);
|
|
39
|
+
}
|
|
40
|
+
async connect() {
|
|
41
|
+
const connectFeature = this.getWalletFeature('bitcoin:connect');
|
|
42
|
+
const response = await connectFeature.connect({ purposes: ['payment', 'ordinals'] });
|
|
43
|
+
const account = response.accounts[0];
|
|
44
|
+
if (!account) {
|
|
45
|
+
throw new Error('No account found');
|
|
46
|
+
}
|
|
47
|
+
this.bindEvents();
|
|
48
|
+
return account.address;
|
|
49
|
+
}
|
|
50
|
+
async getAccountAddresses() {
|
|
51
|
+
const addresses = new Set();
|
|
52
|
+
const mappedAccounts = this.wallet.accounts
|
|
53
|
+
.map(acc => ({
|
|
54
|
+
address: acc.address,
|
|
55
|
+
purpose: 'payment',
|
|
56
|
+
publicKey: Buffer.from(acc.publicKey).toString('hex')
|
|
57
|
+
}))
|
|
58
|
+
.filter(acc => {
|
|
59
|
+
if (addresses.has(acc.address)) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
addresses.add(acc.address);
|
|
63
|
+
return true;
|
|
64
|
+
});
|
|
65
|
+
return Promise.resolve(mappedAccounts);
|
|
66
|
+
}
|
|
67
|
+
async signMessage(params) {
|
|
68
|
+
const feature = this.getWalletFeature('bitcoin:signMessage');
|
|
69
|
+
const account = this.wallet.accounts.find(acc => acc.address === params.address);
|
|
70
|
+
if (!account) {
|
|
71
|
+
throw new Error('Account not found');
|
|
72
|
+
}
|
|
73
|
+
const message = new TextEncoder().encode(params.message);
|
|
74
|
+
const response = (await feature.signMessage({ account, message }))[0];
|
|
75
|
+
if (!response) {
|
|
76
|
+
throw new Error('No response from wallet');
|
|
77
|
+
}
|
|
78
|
+
return Buffer.from(response.signature).toString('base64');
|
|
79
|
+
}
|
|
80
|
+
async signPSBT(params) {
|
|
81
|
+
const feature = this.getWalletFeature('bitcoin:signTransaction');
|
|
82
|
+
if (params.broadcast) {
|
|
83
|
+
throw new MethodNotSupportedError(this.id, 'signPSBT', 'This wallet does not support broadcasting, please broadcast it manually or contact the development team.');
|
|
84
|
+
}
|
|
85
|
+
const inputsToSign = params.signInputs.map(input => {
|
|
86
|
+
const account = this.wallet.accounts.find(acc => acc.address === input.address);
|
|
87
|
+
if (!account) {
|
|
88
|
+
throw new Error(`Account with address ${input.address} not found`);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
account,
|
|
92
|
+
signingIndexes: [input.index],
|
|
93
|
+
sigHash: undefined
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
const response = (await feature.signTransaction({
|
|
97
|
+
psbt: Buffer.from(params.psbt, 'base64'),
|
|
98
|
+
inputsToSign
|
|
99
|
+
}))[0];
|
|
100
|
+
if (!response) {
|
|
101
|
+
throw new Error('No response from wallet');
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
psbt: Buffer.from(response.signedPsbt).toString('base64'),
|
|
105
|
+
txid: undefined
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async sendTransfer(_params) {
|
|
109
|
+
return Promise.reject(new MethodNotSupportedError(this.id, 'sendTransfer', 'Please use "signPSBT" instead and broadcast the transaction manually.'));
|
|
110
|
+
}
|
|
111
|
+
async disconnect() {
|
|
112
|
+
this.unbindEvents();
|
|
113
|
+
return Promise.resolve();
|
|
114
|
+
}
|
|
115
|
+
async request(_args) {
|
|
116
|
+
return Promise.reject(new MethodNotSupportedError(this.id, 'request'));
|
|
117
|
+
}
|
|
118
|
+
getWalletFeature(feature) {
|
|
119
|
+
if (!(feature in this.wallet.features)) {
|
|
120
|
+
throw new MethodNotSupportedError(this.id, feature);
|
|
121
|
+
}
|
|
122
|
+
return this.wallet.features[feature];
|
|
123
|
+
}
|
|
124
|
+
bindEvents() {
|
|
125
|
+
this.unbindEvents();
|
|
126
|
+
try {
|
|
127
|
+
const feature = this.getWalletFeature('standard:events');
|
|
128
|
+
this.walletUnsubscribes.push(feature.on('change', data => {
|
|
129
|
+
if ('accounts' in data && data.accounts) {
|
|
130
|
+
if (data.accounts.length === 0) {
|
|
131
|
+
this.emit('disconnect');
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.emit('accountsChanged', data.accounts.map(acc => acc.address));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
console.warn(`WalletStandardConnector:bindEvents - wallet provider "${this.name}" does not support events`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
unbindEvents() {
|
|
144
|
+
this.walletUnsubscribes.forEach(unsubscribe => unsubscribe());
|
|
145
|
+
this.walletUnsubscribes = [];
|
|
146
|
+
}
|
|
147
|
+
static watchWallets({ callback, requestedChains }) {
|
|
148
|
+
const { get, on } = getWallets();
|
|
149
|
+
function wrapWallets(wallets) {
|
|
150
|
+
// Must replace the filter with the correct function to identify bitcoin wallets
|
|
151
|
+
return wallets
|
|
152
|
+
.filter(wallet => 'bitcoin:connect' in wallet.features)
|
|
153
|
+
.map(wallet => new WalletStandardConnector({ wallet, requestedChains }));
|
|
154
|
+
}
|
|
155
|
+
callback(...wrapWallets(get()));
|
|
156
|
+
return on('register', (...wallets) => callback(...wrapWallets(wallets)));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=WalletStandardConnector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletStandardConnector.js","sourceRoot":"","sources":["../../../../src/connectors/WalletStandardConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class MethodNotSupportedError extends Error {
|
|
2
|
+
constructor(walletId, method, log) {
|
|
3
|
+
super(`Wallet call is not supported`);
|
|
4
|
+
this.name = 'MethodNotSupported';
|
|
5
|
+
this.method = method;
|
|
6
|
+
this.walletId = walletId;
|
|
7
|
+
// eslint-disable-next-line no-console
|
|
8
|
+
console.error(`BitcoinAdapter:MethodNotSupportedError:${walletId} - The connected wallet doesn't support the method "${method}".${log ? ` ${log}` : ''}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=MethodNotSupportedError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MethodNotSupportedError.js","sourceRoot":"","sources":["../../../../src/errors/MethodNotSupportedError.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAKhD,YAAY,QAAgB,EAAE,MAAc,EAAE,GAAY;QACxD,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAL9B,SAAI,GAAG,oBAAoB,CAAA;QAMlC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAExB,sCAAsC;QACtC,OAAO,CAAC,KAAK,CACX,0CAA0C,QAAQ,uDAAuD,MAAM,KAC7G,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EACpB,EAAE,CACH,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAE5B,cAAc,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { bitcoinTestnet } from '@reown/appkit/networks';
|
|
2
|
+
export const BitcoinApi = {
|
|
3
|
+
getUTXOs: async ({ network, address }) => {
|
|
4
|
+
const isTestnet = network.caipNetworkId === bitcoinTestnet.caipNetworkId;
|
|
5
|
+
// Make chain dynamic
|
|
6
|
+
const response = await fetch(`https://mempool.space${isTestnet ? '/testnet' : ''}/api/address/${address}/utxo`);
|
|
7
|
+
if (!response.ok) {
|
|
8
|
+
throw new Error(`Failed to fetch UTXOs: ${await response.text()}`);
|
|
9
|
+
}
|
|
10
|
+
return (await response.json());
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=BitcoinApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinApi.js","sourceRoot":"","sources":["../../../../src/utils/BitcoinApi.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAA6B,EAA8B,EAAE;QAC9F,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,KAAK,cAAc,CAAC,aAAa,CAAA;QACxE,qBAAqB;QAErB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,wBAAwB,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,gBAAgB,OAAO,OAAO,CAClF,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAA;IACrD,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BitcoinConnector.js","sourceRoot":"","sources":["../../../../src/utils/BitcoinConnector.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class ProviderEventEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.listeners = {
|
|
4
|
+
accountsChanged: [],
|
|
5
|
+
chainChanged: [],
|
|
6
|
+
connect: [],
|
|
7
|
+
disconnect: [],
|
|
8
|
+
display_uri: [],
|
|
9
|
+
message: []
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
on(event, listener) {
|
|
13
|
+
this.listeners[event].push(listener);
|
|
14
|
+
}
|
|
15
|
+
removeListener(event, listener) {
|
|
16
|
+
if (event in this.listeners) {
|
|
17
|
+
// @ts-expect-error - Bad typed Provider from core package
|
|
18
|
+
this.listeners[event] = this.listeners[event].filter((l) => l !== listener);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
emit(event, data) {
|
|
22
|
+
if (event in this.listeners) {
|
|
23
|
+
// @ts-expect-error - Bad typed Provider from core package
|
|
24
|
+
this.listeners[event].forEach(listener => listener(data));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ProviderEventEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderEventEmitter.js","sourceRoot":"","sources":["../../../../src/utils/ProviderEventEmitter.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,oBAAoB;IAAjC;QACU,cAAS,GAAc;YAC7B,eAAe,EAAE,EAAE;YACnB,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;SACZ,CAAA;IAmBH,CAAC;IAjBC,EAAE,CAAuB,KAAY,EAAE,QAAyB;QAC9D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAED,cAAc,CAAI,KAAa,EAAE,QAA2B;QAC1D,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,0DAA0D;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAA;QAC/F,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,KAAa,EAAE,IAAc;QACvC,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,0DAA0D;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const UnitsUtil = {
|
|
2
|
+
parseSatoshis(amount, network) {
|
|
3
|
+
const value = parseFloat(amount) / 10 ** network.nativeCurrency.decimals;
|
|
4
|
+
// eslint-disable-next-line new-cap
|
|
5
|
+
return Intl.NumberFormat('en-US', {
|
|
6
|
+
maximumFractionDigits: network.nativeCurrency.decimals
|
|
7
|
+
}).format(value);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=UnitsUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnitsUtil.js","sourceRoot":"","sources":["../../../../src/utils/UnitsUtil.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,aAAa,CAAC,MAAc,EAAE,OAAoB;QAChD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAA;QAExE,mCAAmC;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YAChC,qBAAqB,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ;SACvD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAClB,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import UniversalProvider from '@walletconnect/universal-provider';
|
|
2
|
+
import { WcHelpersUtil } from '@reown/appkit';
|
|
3
|
+
import { ProviderEventEmitter } from './ProviderEventEmitter.js';
|
|
4
|
+
export class WalletConnectProvider extends ProviderEventEmitter {
|
|
5
|
+
constructor({ provider, chains, getActiveChain }) {
|
|
6
|
+
super();
|
|
7
|
+
this.id = 'WalletConnect';
|
|
8
|
+
this.name = 'WalletConnect';
|
|
9
|
+
this.type = 'WALLET_CONNECT';
|
|
10
|
+
this.chain = 'bip122';
|
|
11
|
+
this.icon = 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/05338e12-4f75-4982-4e8a-83c67b826b00/md';
|
|
12
|
+
this.requestedChains = chains;
|
|
13
|
+
this.provider = provider;
|
|
14
|
+
this.getActiveChain = getActiveChain;
|
|
15
|
+
}
|
|
16
|
+
// -- Public ------------------------------------------- //
|
|
17
|
+
get chains() {
|
|
18
|
+
return this.sessionChains
|
|
19
|
+
.map(chainId => this.requestedChains.find(chain => chain.caipNetworkId === chainId))
|
|
20
|
+
.filter(Boolean);
|
|
21
|
+
}
|
|
22
|
+
async connect() {
|
|
23
|
+
return Promise.reject(new Error('Connection of WalletConnectProvider should be done via UniversalAdapter'));
|
|
24
|
+
}
|
|
25
|
+
async disconnect() {
|
|
26
|
+
return this.provider.disconnect();
|
|
27
|
+
}
|
|
28
|
+
async signMessage({ message, address }) {
|
|
29
|
+
this.checkIfMethodIsSupported('signMessage');
|
|
30
|
+
const signedMessage = await this.internalRequest({
|
|
31
|
+
method: 'signMessage',
|
|
32
|
+
params: { message, account: address, address }
|
|
33
|
+
});
|
|
34
|
+
return Buffer.from(signedMessage.signature, 'hex').toString('base64');
|
|
35
|
+
}
|
|
36
|
+
async sendTransfer({ recipient, amount }) {
|
|
37
|
+
this.checkIfMethodIsSupported('sendTransfer');
|
|
38
|
+
const account = this.getAccount(true);
|
|
39
|
+
const result = await this.internalRequest({
|
|
40
|
+
method: 'sendTransfer',
|
|
41
|
+
params: {
|
|
42
|
+
account,
|
|
43
|
+
recipientAddress: recipient,
|
|
44
|
+
amount
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return result.txid;
|
|
48
|
+
}
|
|
49
|
+
async getAccountAddresses() {
|
|
50
|
+
this.checkIfMethodIsSupported('getAccountAddresses');
|
|
51
|
+
const addresses = await this.internalRequest({
|
|
52
|
+
method: 'getAccountAddresses',
|
|
53
|
+
params: undefined
|
|
54
|
+
});
|
|
55
|
+
return addresses.map(address => ({ address, purpose: 'payment' }));
|
|
56
|
+
}
|
|
57
|
+
async signPSBT(params) {
|
|
58
|
+
this.checkIfMethodIsSupported('signPsbt');
|
|
59
|
+
const account = this.getAccount(true);
|
|
60
|
+
const response = await this.internalRequest({
|
|
61
|
+
method: 'signPsbt',
|
|
62
|
+
params: {
|
|
63
|
+
account,
|
|
64
|
+
psbt: params.psbt,
|
|
65
|
+
signInputs: params.signInputs,
|
|
66
|
+
broadcast: params.broadcast
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
psbt: response.psbt,
|
|
71
|
+
txid: response.txid
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
request(args) {
|
|
75
|
+
// @ts-expect-error - args type should match internalRequest arguments but it's not correctly typed in Provider
|
|
76
|
+
return this.internalRequest(args);
|
|
77
|
+
}
|
|
78
|
+
// -- Private ------------------------------------------ //
|
|
79
|
+
get sessionChains() {
|
|
80
|
+
return WcHelpersUtil.getChainsFromNamespaces(this.provider.session?.namespaces);
|
|
81
|
+
}
|
|
82
|
+
getAccount(required) {
|
|
83
|
+
const account = this.provider.session?.namespaces['bip122']?.accounts[0];
|
|
84
|
+
if (!account) {
|
|
85
|
+
if (required) {
|
|
86
|
+
throw new Error('Account not found');
|
|
87
|
+
}
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
const address = account.split(':')[2];
|
|
91
|
+
if (!address) {
|
|
92
|
+
if (required) {
|
|
93
|
+
throw new Error('Address not found');
|
|
94
|
+
}
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
return address;
|
|
98
|
+
}
|
|
99
|
+
checkIfMethodIsSupported(method) {
|
|
100
|
+
if (!this.provider.session?.namespaces['bip122']?.methods.includes(method)) {
|
|
101
|
+
throw new Error(`Method ${method} is not supported`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async internalRequest({ method, params }) {
|
|
105
|
+
const chain = this.getActiveChain();
|
|
106
|
+
if (!chain) {
|
|
107
|
+
throw new Error('Chain not found');
|
|
108
|
+
}
|
|
109
|
+
return this.provider.request({
|
|
110
|
+
method,
|
|
111
|
+
params
|
|
112
|
+
}, chain.caipNetworkId);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=WalletConnectProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletConnectProvider.js","sourceRoot":"","sources":["../../../../src/utils/WalletConnectProvider.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,mCAAmC,CAAA;AAEjE,OAAO,EAAE,aAAa,EAAyB,MAAM,eAAe,CAAA;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAQhE,MAAM,OAAO,qBAAsB,SAAQ,oBAAoB;IAY7D,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAA+B;QAC3E,KAAK,EAAE,CAAA;QAZO,OAAE,GAAG,eAAe,CAAA;QACpB,SAAI,GAAG,eAAe,CAAA;QACtB,SAAI,GAAG,gBAAgB,CAAA;QACvB,UAAK,GAAG,QAAQ,CAAA;QAChB,SAAI,GAClB,0FAA0F,CAAA;QAQ1F,IAAI,CAAC,eAAe,GAAG,MAAM,CAAA;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;IACtC,CAAC;IAED,2DAA2D;IAC3D,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,aAAa;aACtB,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,OAAO,CAAC,CAAC;aACnF,MAAM,CAAC,OAAO,CAAkB,CAAA;IACrC,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,yEAAyE,CAAC,CACrF,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAA;IACnC,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAsC;QAC/E,IAAI,CAAC,wBAAwB,CAAC,aAAa,CAAC,CAAA;QAE5C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;YAC/C,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;SAC/C,CAAC,CAAA;QAEF,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACvE,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,MAAM,EAAuC;QAClF,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAA;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAErC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;YACxC,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE;gBACN,OAAO;gBACP,gBAAgB,EAAE,SAAS;gBAC3B,MAAM;aACP;SACF,CAAC,CAAA;QAEF,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IAEM,KAAK,CAAC,mBAAmB;QAC9B,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,CAAC,CAAA;QAEpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;YAC3C,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QAEF,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAA;IACpE,CAAC;IAEM,KAAK,CAAC,QAAQ,CACnB,MAAuC;QAEvC,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;YAC1C,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE;gBACN,OAAO;gBACP,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;aAC5B;SACF,CAAC,CAAA;QAEF,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAA;IACH,CAAC;IAEM,OAAO,CAAI,IAAsB;QACtC,+GAA+G;QAC/G,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAM,CAAA;IACxC,CAAC;IAED,2DAA2D;IAC3D,IAAY,aAAa;QACvB,OAAO,aAAa,CAAC,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACjF,CAAC;IAEO,UAAU,CAChB,QAAmB;QAEnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;QACxE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACtC,CAAC;YAED,OAAO,SAAgE,CAAA;QACzE,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;YACtC,CAAC;YAED,OAAO,SAAgE,CAAA;QACzE,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,wBAAwB,CAAC,MAA2C;QAC1E,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,UAAU,MAAM,mBAAmB,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAqD,EAChF,MAAM,EACN,MAAM,EAC8C;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAC1B;YACE,MAAM;YACN,MAAM;SACP,EACD,KAAK,CAAC,aAAa,CACpB,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This should be in the package `@exodus/bitcoin-wallet-standard`, but as it is outdated we have it here.
|
|
3
|
+
* References to https://github.com/ExodusMovement/bitcoin-wallet-standard/blob/master/packages/core/features/src/signMessage.ts
|
|
4
|
+
*/
|
|
5
|
+
/** Name of the feature. */
|
|
6
|
+
export const BitcoinSignMessage = 'bitcoin:signMessage';
|
|
7
|
+
//# sourceMappingURL=SignMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignMessage.js","sourceRoot":"","sources":["../../../../../src/utils/wallet-standard/SignMessage.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,2BAA2B;AAC3B,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This should be in the package `@exodus/bitcoin-wallet-standard`, but as it is outdated we have it here.
|
|
3
|
+
* References to https://github.com/ExodusMovement/bitcoin-wallet-standard/blob/master/packages/core/features/src/signTransaction.ts
|
|
4
|
+
*/
|
|
5
|
+
/** Name of the feature. */
|
|
6
|
+
export const BitcoinSignTransaction = 'bitcoin:signTransaction';
|
|
7
|
+
//# sourceMappingURL=SignTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignTransaction.js","sourceRoot":"","sources":["../../../../../src/utils/wallet-standard/SignTransaction.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,2BAA2B;AAC3B,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletFeatures.js","sourceRoot":"","sources":["../../../../../src/utils/wallet-standard/WalletFeatures.ts"],"names":[],"mappings":""}
|