@txnlab/use-wallet-walletconnect 5.0.0-rc.1
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 +21 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.js +490 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TxnLab, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import algosdk from "algosdk";
|
|
2
|
+
import { AdapterConstructorParams, BaseWallet, WalletAccount, WalletMetadata } from "@txnlab/use-wallet/adapter";
|
|
3
|
+
import { WalletConnectModalConfig } from "@walletconnect/modal";
|
|
4
|
+
import { SignClientTypes } from "@walletconnect/types";
|
|
5
|
+
import { WalletAdapterConfig } from "@txnlab/use-wallet";
|
|
6
|
+
|
|
7
|
+
//#region src/skins.d.ts
|
|
8
|
+
interface WalletConnectSkin {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
}
|
|
13
|
+
type WalletConnectSkinOption = string | WalletConnectSkin;
|
|
14
|
+
/**
|
|
15
|
+
* Built-in skins that ship with the WalletConnect adapter.
|
|
16
|
+
* PRs to add new WalletConnect-compatible wallets should add entries here.
|
|
17
|
+
*/
|
|
18
|
+
declare const BUILTIN_SKINS: Record<string, WalletConnectSkin>;
|
|
19
|
+
/**
|
|
20
|
+
* Register a custom WalletConnect skin at runtime.
|
|
21
|
+
* This allows developers to add their own wallet skins without PRing the library.
|
|
22
|
+
*
|
|
23
|
+
* @param skin - The skin definition to register
|
|
24
|
+
* @throws Error if attempting to override a built-in skin
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* import { registerSkin } from '@txnlab/use-wallet-walletconnect'
|
|
29
|
+
*
|
|
30
|
+
* registerSkin({
|
|
31
|
+
* id: 'mywallet',
|
|
32
|
+
* name: 'My Custom Wallet',
|
|
33
|
+
* icon: 'data:image/svg+xml;base64,...'
|
|
34
|
+
* })
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare function registerSkin(skin: WalletConnectSkin): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get a skin by its ID from either built-in or custom registries.
|
|
40
|
+
*
|
|
41
|
+
* @param skinId - The skin identifier
|
|
42
|
+
* @returns The skin definition, or undefined if not found
|
|
43
|
+
*/
|
|
44
|
+
declare function getSkin(skinId: string): WalletConnectSkin | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a skin option to a full WalletConnectSkin object.
|
|
47
|
+
*
|
|
48
|
+
* If the option is a string, looks up the skin in the registries.
|
|
49
|
+
* If the option is a full skin object, registers it as a custom skin and returns it.
|
|
50
|
+
*
|
|
51
|
+
* @param skinOption - Either a skin ID string or a full skin definition
|
|
52
|
+
* @returns The resolved skin, or undefined if not found (when string ID provided)
|
|
53
|
+
*/
|
|
54
|
+
declare function resolveSkin(skinOption: WalletConnectSkinOption): WalletConnectSkin | undefined;
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/adapter.d.ts
|
|
57
|
+
interface SignClientOptions {
|
|
58
|
+
projectId: string;
|
|
59
|
+
relayUrl?: string;
|
|
60
|
+
metadata?: SignClientTypes.Metadata;
|
|
61
|
+
}
|
|
62
|
+
type WalletConnectModalOptions = Pick<WalletConnectModalConfig, 'enableExplorer' | 'explorerRecommendedWalletIds' | 'privacyPolicyUrl' | 'termsOfServiceUrl' | 'themeMode' | 'themeVariables'>;
|
|
63
|
+
type WalletConnectBaseOptions = SignClientOptions & WalletConnectModalOptions;
|
|
64
|
+
interface WalletConnectOptions extends WalletConnectBaseOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Optional skin to apply to this WalletConnect instance.
|
|
67
|
+
* Can be either:
|
|
68
|
+
* - A string ID referencing a built-in skin (e.g., 'biatec')
|
|
69
|
+
* - A full skin object with id, name, and icon
|
|
70
|
+
*
|
|
71
|
+
* When a skin is applied, the wallet will use the skin's metadata
|
|
72
|
+
* and a unique walletKey for state isolation.
|
|
73
|
+
*/
|
|
74
|
+
skin?: WalletConnectSkinOption;
|
|
75
|
+
}
|
|
76
|
+
type SignTxnsResponse = Array<Uint8Array | number[] | string | null | undefined>;
|
|
77
|
+
declare class SessionError extends Error {
|
|
78
|
+
constructor(message: string);
|
|
79
|
+
}
|
|
80
|
+
declare class WalletConnectAdapter extends BaseWallet<WalletConnectOptions> {
|
|
81
|
+
private client;
|
|
82
|
+
private clientOptions;
|
|
83
|
+
private modal;
|
|
84
|
+
private modalOptions;
|
|
85
|
+
private session;
|
|
86
|
+
constructor(params: AdapterConstructorParams<WalletConnectOptions>);
|
|
87
|
+
static defaultMetadata: WalletMetadata;
|
|
88
|
+
/**
|
|
89
|
+
* Get metadata from the current window. This is adapted from the @walletconnect/utils
|
|
90
|
+
* implementation, to avoid requiring the entire package as a dependency.
|
|
91
|
+
* @see https://github.com/WalletConnect/walletconnect-utils/blob/master/browser/window-metadata/src/index.ts
|
|
92
|
+
*/
|
|
93
|
+
private getWindowMetadata;
|
|
94
|
+
private initializeClient;
|
|
95
|
+
private initializeModal;
|
|
96
|
+
private onSessionConnected;
|
|
97
|
+
get activeChainId(): string;
|
|
98
|
+
connect: () => Promise<WalletAccount[]>;
|
|
99
|
+
disconnect: () => Promise<void>;
|
|
100
|
+
resumeSession: () => Promise<void>;
|
|
101
|
+
private processTxns;
|
|
102
|
+
private processEncodedTxns;
|
|
103
|
+
signTransactions: <T extends algosdk.Transaction[] | Uint8Array[]>(txnGroup: T | T[], indexesToSign?: number[]) => Promise<(Uint8Array | null)[]>;
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/index.d.ts
|
|
107
|
+
declare const WALLET_ID: "walletconnect";
|
|
108
|
+
declare function walletConnect(options: WalletConnectOptions): WalletAdapterConfig;
|
|
109
|
+
//#endregion
|
|
110
|
+
export { BUILTIN_SKINS, SessionError, type SignTxnsResponse, WALLET_ID, WalletConnectAdapter, type WalletConnectOptions, type WalletConnectSkin, type WalletConnectSkinOption, getSkin, registerSkin, resolveSkin, walletConnect };
|
|
111
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import algosdk from "algosdk";
|
|
2
|
+
import { BaseWallet, base64ToByteArray, byteArrayToBase64, compareAccounts, flattenTxnGroup, formatJsonRpcRequest, isSignedTxn, isTransactionArray } from "@txnlab/use-wallet/adapter";
|
|
3
|
+
//#region src/icon.ts
|
|
4
|
+
const icon = `
|
|
5
|
+
<svg viewBox="0 0 480 480" xmlns="http://www.w3.org/2000/svg">
|
|
6
|
+
<rect width="480" height="480" fill="#FFFFFF" />
|
|
7
|
+
<path fill="#3396FF" d="M126.6,168c62.6-61.3,164.2-61.3,226.8,0l7.5,7.4c3.1,3.1,3.1,8,0,11.1l-25.8,25.2c-1.6,1.5-4.1,1.5-5.7,0l-10.4-10.2c-43.7-42.8-114.5-42.8-158.2,0l-11.1,10.9c-1.6,1.5-4.1,1.5-5.7,0l-25.8-25.2c-3.1-3.1-3.1-8,0-11.1L126.6,168zM406.7,220.2l22.9,22.5c3.1,3.1,3.1,8,0,11.1L326.2,355.1c-3.1,3.1-8.2,3.1-11.3,0l-73.4-71.9c-0.8-0.8-2.1-0.8-2.8,0l-73.4,71.9c-3.1,3.1-8.2,3.1-11.3,0L50.3,253.8c-3.1-3.1-3.1-8,0-11.1l22.9-22.5c3.1-3.1,8.2-3.1,11.3,0l73.4,71.9c0.8,0.8,2.1,0.8,2.8,0 l73.4-71.9c3.1-3.1,8.2-3.1,11.3,0l73.4,71.9c0.8,0.8,2.1,0.8,2.8,0l73.4-71.9C398.5,217.1,403.6,217.1,406.7,220.2L406.7,220.2z" />
|
|
8
|
+
</svg>
|
|
9
|
+
`;
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/adapter.ts
|
|
12
|
+
var SessionError = class extends Error {
|
|
13
|
+
constructor(message) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = "SessionError";
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const ICON = `data:image/svg+xml;base64,${btoa(icon)}`;
|
|
19
|
+
var WalletConnectAdapter = class extends BaseWallet {
|
|
20
|
+
client = null;
|
|
21
|
+
clientOptions;
|
|
22
|
+
modal = null;
|
|
23
|
+
modalOptions;
|
|
24
|
+
session = null;
|
|
25
|
+
constructor(params) {
|
|
26
|
+
super(params);
|
|
27
|
+
if (!this.options?.projectId) {
|
|
28
|
+
this.logger.error("Missing required option: projectId");
|
|
29
|
+
throw new Error("Missing required option: projectId");
|
|
30
|
+
}
|
|
31
|
+
const { projectId, relayUrl = "wss://relay.walletconnect.com", metadata: metadataOptions, skin: _skinOption, ...modalOptions } = this.options;
|
|
32
|
+
this.clientOptions = {
|
|
33
|
+
projectId,
|
|
34
|
+
relayUrl,
|
|
35
|
+
metadata: {
|
|
36
|
+
...this.getWindowMetadata(),
|
|
37
|
+
...metadataOptions
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
this.modalOptions = modalOptions;
|
|
41
|
+
}
|
|
42
|
+
static defaultMetadata = {
|
|
43
|
+
name: "WalletConnect",
|
|
44
|
+
icon: ICON
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Get metadata from the current window. This is adapted from the @walletconnect/utils
|
|
48
|
+
* implementation, to avoid requiring the entire package as a dependency.
|
|
49
|
+
* @see https://github.com/WalletConnect/walletconnect-utils/blob/master/browser/window-metadata/src/index.ts
|
|
50
|
+
*/
|
|
51
|
+
getWindowMetadata() {
|
|
52
|
+
let doc;
|
|
53
|
+
let loc;
|
|
54
|
+
const defaultMetadata = {
|
|
55
|
+
name: "",
|
|
56
|
+
description: "",
|
|
57
|
+
url: "",
|
|
58
|
+
icons: []
|
|
59
|
+
};
|
|
60
|
+
function getFromWindow(name) {
|
|
61
|
+
let res;
|
|
62
|
+
if (typeof window !== "undefined" && typeof window[name] !== "undefined") res = window[name];
|
|
63
|
+
return res;
|
|
64
|
+
}
|
|
65
|
+
function getFromWindowOrThrow(name) {
|
|
66
|
+
const res = getFromWindow(name);
|
|
67
|
+
if (!res) throw new Error(`${name} is not defined in Window`);
|
|
68
|
+
return res;
|
|
69
|
+
}
|
|
70
|
+
function getDocumentOrThrow() {
|
|
71
|
+
return getFromWindowOrThrow("document");
|
|
72
|
+
}
|
|
73
|
+
function getLocationOrThrow() {
|
|
74
|
+
return getFromWindowOrThrow("location");
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
doc = getDocumentOrThrow();
|
|
78
|
+
loc = getLocationOrThrow();
|
|
79
|
+
} catch (error) {
|
|
80
|
+
this.logger.warn("Error getting window metadata:", error);
|
|
81
|
+
return defaultMetadata;
|
|
82
|
+
}
|
|
83
|
+
function getIcons() {
|
|
84
|
+
const links = doc.getElementsByTagName("link");
|
|
85
|
+
const icons = [];
|
|
86
|
+
for (let i = 0; i < links.length; i++) {
|
|
87
|
+
const link = links[i];
|
|
88
|
+
const rel = link.getAttribute("rel");
|
|
89
|
+
if (rel) {
|
|
90
|
+
if (rel.toLowerCase().indexOf("icon") > -1) {
|
|
91
|
+
const href = link.getAttribute("href");
|
|
92
|
+
if (href) if (href.toLowerCase().indexOf("https:") === -1 && href.toLowerCase().indexOf("http:") === -1 && href.indexOf("//") !== 0) {
|
|
93
|
+
let absoluteHref = loc.protocol + "//" + loc.host;
|
|
94
|
+
if (href.indexOf("/") === 0) absoluteHref += href;
|
|
95
|
+
else {
|
|
96
|
+
const path = loc.pathname.split("/");
|
|
97
|
+
path.pop();
|
|
98
|
+
const finalPath = path.join("/");
|
|
99
|
+
absoluteHref += finalPath + "/" + href;
|
|
100
|
+
}
|
|
101
|
+
icons.push(absoluteHref);
|
|
102
|
+
} else if (href.indexOf("//") === 0) {
|
|
103
|
+
const absoluteUrl = loc.protocol + href;
|
|
104
|
+
icons.push(absoluteUrl);
|
|
105
|
+
} else icons.push(href);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return icons;
|
|
110
|
+
}
|
|
111
|
+
function getWindowMetadataOfAny(...args) {
|
|
112
|
+
const metaTags = doc.getElementsByTagName("meta");
|
|
113
|
+
for (let i = 0; i < metaTags.length; i++) {
|
|
114
|
+
const tag = metaTags[i];
|
|
115
|
+
const attributes = [
|
|
116
|
+
"itemprop",
|
|
117
|
+
"property",
|
|
118
|
+
"name"
|
|
119
|
+
].map((target) => tag.getAttribute(target)).filter((attr) => {
|
|
120
|
+
if (attr) return args.includes(attr);
|
|
121
|
+
return false;
|
|
122
|
+
});
|
|
123
|
+
if (attributes.length && attributes) {
|
|
124
|
+
const content = tag.getAttribute("content");
|
|
125
|
+
if (content) return content;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return "";
|
|
129
|
+
}
|
|
130
|
+
function getName() {
|
|
131
|
+
let name = getWindowMetadataOfAny("name", "og:site_name", "og:title", "twitter:title");
|
|
132
|
+
if (!name) name = doc.title;
|
|
133
|
+
return name;
|
|
134
|
+
}
|
|
135
|
+
function getDescription() {
|
|
136
|
+
return getWindowMetadataOfAny("description", "og:description", "twitter:description", "keywords");
|
|
137
|
+
}
|
|
138
|
+
const name = getName();
|
|
139
|
+
return {
|
|
140
|
+
description: getDescription(),
|
|
141
|
+
url: loc.origin,
|
|
142
|
+
icons: getIcons(),
|
|
143
|
+
name
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
async initializeClient() {
|
|
147
|
+
this.logger.info("Initializing client...");
|
|
148
|
+
const client = await (await import("@walletconnect/sign-client")).SignClient.init(this.clientOptions);
|
|
149
|
+
client.on("session_event", (args) => {
|
|
150
|
+
this.logger.info("EVENT: session_event", args);
|
|
151
|
+
});
|
|
152
|
+
client.on("session_update", ({ topic, params }) => {
|
|
153
|
+
this.logger.info("EVENT: session_update", {
|
|
154
|
+
topic,
|
|
155
|
+
params
|
|
156
|
+
});
|
|
157
|
+
const { namespaces } = params;
|
|
158
|
+
const updatedSession = {
|
|
159
|
+
...client.session.get(topic),
|
|
160
|
+
namespaces
|
|
161
|
+
};
|
|
162
|
+
this.onSessionConnected(updatedSession);
|
|
163
|
+
});
|
|
164
|
+
client.on("session_delete", () => {
|
|
165
|
+
this.logger.info("EVENT: session_delete");
|
|
166
|
+
this.session = null;
|
|
167
|
+
});
|
|
168
|
+
this.client = client;
|
|
169
|
+
this.logger.info("Client initialized");
|
|
170
|
+
return client;
|
|
171
|
+
}
|
|
172
|
+
async initializeModal() {
|
|
173
|
+
this.logger.info("Initializing modal...");
|
|
174
|
+
const WalletConnectModal = (await import("@walletconnect/modal")).WalletConnectModal;
|
|
175
|
+
const modal = new WalletConnectModal({
|
|
176
|
+
projectId: this.clientOptions.projectId,
|
|
177
|
+
...this.modalOptions
|
|
178
|
+
});
|
|
179
|
+
modal.subscribeModal((state) => this.logger.info(`Modal ${state.open ? "open" : "closed"}`));
|
|
180
|
+
this.modal = modal;
|
|
181
|
+
this.logger.info("Modal initialized");
|
|
182
|
+
return modal;
|
|
183
|
+
}
|
|
184
|
+
onSessionConnected(session) {
|
|
185
|
+
const caipAccounts = session.namespaces.algorand.accounts;
|
|
186
|
+
if (!caipAccounts.length) {
|
|
187
|
+
this.logger.error("No accounts found!");
|
|
188
|
+
throw new Error("No accounts found!");
|
|
189
|
+
}
|
|
190
|
+
const walletAccounts = [...new Set(caipAccounts.map((account) => account.split(":").pop()))].map((address, idx) => ({
|
|
191
|
+
name: `${this.metadata.name} Account ${idx + 1}`,
|
|
192
|
+
address
|
|
193
|
+
}));
|
|
194
|
+
const walletState = this.store.getWalletState();
|
|
195
|
+
if (!walletState) {
|
|
196
|
+
const newWalletState = {
|
|
197
|
+
accounts: walletAccounts,
|
|
198
|
+
activeAccount: walletAccounts[0]
|
|
199
|
+
};
|
|
200
|
+
this.store.addWallet(newWalletState);
|
|
201
|
+
this.logger.info("Connected", newWalletState);
|
|
202
|
+
} else if (!compareAccounts(walletAccounts, walletState.accounts)) {
|
|
203
|
+
this.logger.warn("Session accounts mismatch, updating accounts", {
|
|
204
|
+
prev: walletState.accounts,
|
|
205
|
+
current: walletAccounts
|
|
206
|
+
});
|
|
207
|
+
this.store.setAccounts(walletAccounts);
|
|
208
|
+
}
|
|
209
|
+
this.session = session;
|
|
210
|
+
return walletAccounts;
|
|
211
|
+
}
|
|
212
|
+
get activeChainId() {
|
|
213
|
+
const network = this.activeNetworkConfig;
|
|
214
|
+
if (!network?.caipChainId) {
|
|
215
|
+
this.logger.warn(`No CAIP-2 chain ID found for network: ${this.activeNetwork}`);
|
|
216
|
+
return "";
|
|
217
|
+
}
|
|
218
|
+
return network.caipChainId;
|
|
219
|
+
}
|
|
220
|
+
connect = async () => {
|
|
221
|
+
this.logger.info("Connecting...");
|
|
222
|
+
try {
|
|
223
|
+
const client = this.client || await this.initializeClient();
|
|
224
|
+
const modal = this.modal || await this.initializeModal();
|
|
225
|
+
const requiredNamespaces = { algorand: {
|
|
226
|
+
chains: [this.activeChainId],
|
|
227
|
+
methods: ["algo_signTxn"],
|
|
228
|
+
events: []
|
|
229
|
+
} };
|
|
230
|
+
const { uri, approval } = await client.connect({ requiredNamespaces });
|
|
231
|
+
if (!uri) {
|
|
232
|
+
this.logger.error("No URI found");
|
|
233
|
+
throw new Error("No URI found");
|
|
234
|
+
}
|
|
235
|
+
await modal.openModal({ uri });
|
|
236
|
+
const session = await approval();
|
|
237
|
+
const walletAccounts = this.onSessionConnected(session);
|
|
238
|
+
this.logger.info("Connected successfully");
|
|
239
|
+
return walletAccounts;
|
|
240
|
+
} catch (error) {
|
|
241
|
+
this.logger.error("Error connecting:", error.message);
|
|
242
|
+
throw error;
|
|
243
|
+
} finally {
|
|
244
|
+
this.modal?.closeModal();
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
disconnect = async () => {
|
|
248
|
+
this.logger.info("Disconnecting...");
|
|
249
|
+
try {
|
|
250
|
+
this.onDisconnect();
|
|
251
|
+
if (this.client && this.session) await this.client.disconnect({
|
|
252
|
+
topic: this.session.topic,
|
|
253
|
+
reason: {
|
|
254
|
+
message: "User disconnected.",
|
|
255
|
+
code: 6e3
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
this.logger.info("Disconnected");
|
|
259
|
+
} catch (error) {
|
|
260
|
+
this.logger.error("Error disconnecting:", error.message);
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
resumeSession = async () => {
|
|
265
|
+
try {
|
|
266
|
+
if (!this.store.getWalletState()) {
|
|
267
|
+
this.logger.info("No session to resume");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
this.logger.info("Resuming session...");
|
|
271
|
+
const client = this.client || await this.initializeClient();
|
|
272
|
+
if (client.session.length) {
|
|
273
|
+
const lastKeyIndex = client.session.keys.length - 1;
|
|
274
|
+
const restoredSession = client.session.get(client.session.keys[lastKeyIndex]);
|
|
275
|
+
this.onSessionConnected(restoredSession);
|
|
276
|
+
}
|
|
277
|
+
this.logger.info("Session resumed successfully");
|
|
278
|
+
} catch (error) {
|
|
279
|
+
this.logger.error("Error resuming session:", error.message);
|
|
280
|
+
this.onDisconnect();
|
|
281
|
+
throw error;
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
processTxns(txnGroup, indexesToSign) {
|
|
285
|
+
const txnsToSign = [];
|
|
286
|
+
txnGroup.forEach((txn, index) => {
|
|
287
|
+
const isIndexMatch = !indexesToSign || indexesToSign.includes(index);
|
|
288
|
+
const signer = txn.sender.toString();
|
|
289
|
+
const canSignTxn = this.addresses.includes(signer);
|
|
290
|
+
const txnString = byteArrayToBase64(txn.toByte());
|
|
291
|
+
if (isIndexMatch && canSignTxn) txnsToSign.push({ txn: txnString });
|
|
292
|
+
else txnsToSign.push({
|
|
293
|
+
txn: txnString,
|
|
294
|
+
signers: []
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
return txnsToSign;
|
|
298
|
+
}
|
|
299
|
+
processEncodedTxns(txnGroup, indexesToSign) {
|
|
300
|
+
const txnsToSign = [];
|
|
301
|
+
txnGroup.forEach((txnBuffer, index) => {
|
|
302
|
+
const isSigned = isSignedTxn(algosdk.msgpackRawDecode(txnBuffer));
|
|
303
|
+
const txn = isSigned ? algosdk.decodeSignedTransaction(txnBuffer).txn : algosdk.decodeUnsignedTransaction(txnBuffer);
|
|
304
|
+
const isIndexMatch = !indexesToSign || indexesToSign.includes(index);
|
|
305
|
+
const signer = txn.sender.toString();
|
|
306
|
+
const canSignTxn = !isSigned && this.addresses.includes(signer);
|
|
307
|
+
const txnString = byteArrayToBase64(txn.toByte());
|
|
308
|
+
if (isIndexMatch && canSignTxn) txnsToSign.push({ txn: txnString });
|
|
309
|
+
else txnsToSign.push({
|
|
310
|
+
txn: txnString,
|
|
311
|
+
signers: []
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
return txnsToSign;
|
|
315
|
+
}
|
|
316
|
+
signTransactions = async (txnGroup, indexesToSign) => {
|
|
317
|
+
try {
|
|
318
|
+
if (!this.session) {
|
|
319
|
+
this.logger.error("No session found!");
|
|
320
|
+
throw new SessionError("No session found!");
|
|
321
|
+
}
|
|
322
|
+
this.logger.debug("Signing transactions...", {
|
|
323
|
+
txnGroup,
|
|
324
|
+
indexesToSign
|
|
325
|
+
});
|
|
326
|
+
let txnsToSign = [];
|
|
327
|
+
if (isTransactionArray(txnGroup)) {
|
|
328
|
+
const flatTxns = flattenTxnGroup(txnGroup);
|
|
329
|
+
txnsToSign = this.processTxns(flatTxns, indexesToSign);
|
|
330
|
+
} else {
|
|
331
|
+
const flatTxns = flattenTxnGroup(txnGroup);
|
|
332
|
+
txnsToSign = this.processEncodedTxns(flatTxns, indexesToSign);
|
|
333
|
+
}
|
|
334
|
+
const client = this.client || await this.initializeClient();
|
|
335
|
+
this.logger.debug("Sending processed transactions to wallet...", [txnsToSign]);
|
|
336
|
+
const request = formatJsonRpcRequest("algo_signTxn", [txnsToSign]);
|
|
337
|
+
const signTxnsResult = await client.request({
|
|
338
|
+
chainId: this.activeChainId,
|
|
339
|
+
topic: this.session.topic,
|
|
340
|
+
request
|
|
341
|
+
});
|
|
342
|
+
this.logger.debug("Received signed transactions from wallet", signTxnsResult);
|
|
343
|
+
const signedTxns = signTxnsResult.reduce((acc, value) => {
|
|
344
|
+
if (value) {
|
|
345
|
+
let signedTxn;
|
|
346
|
+
if (typeof value === "string") signedTxn = base64ToByteArray(value);
|
|
347
|
+
else if (value instanceof Uint8Array) signedTxn = value;
|
|
348
|
+
else if (Array.isArray(value)) signedTxn = new Uint8Array(value);
|
|
349
|
+
else {
|
|
350
|
+
this.logger.warn("Unexpected type in signTxnsResult", value);
|
|
351
|
+
signedTxn = new Uint8Array();
|
|
352
|
+
}
|
|
353
|
+
acc.push(signedTxn);
|
|
354
|
+
}
|
|
355
|
+
return acc;
|
|
356
|
+
}, []);
|
|
357
|
+
const result = txnsToSign.reduce((acc, txn) => {
|
|
358
|
+
if (txn.signers && txn.signers.length == 0) acc.push(null);
|
|
359
|
+
else {
|
|
360
|
+
const signedTxn = signedTxns.shift();
|
|
361
|
+
if (signedTxn) acc.push(signedTxn);
|
|
362
|
+
}
|
|
363
|
+
return acc;
|
|
364
|
+
}, []);
|
|
365
|
+
this.logger.debug("Transactions signed successfully", result);
|
|
366
|
+
return result;
|
|
367
|
+
} catch (error) {
|
|
368
|
+
this.logger.error("Error signing transactions:", error.message);
|
|
369
|
+
throw error;
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
};
|
|
373
|
+
//#endregion
|
|
374
|
+
//#region src/skins.ts
|
|
375
|
+
const VOI_WALLET_ICON = `data:image/svg+xml;base64,${btoa(`
|
|
376
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="322" height="322">
|
|
377
|
+
<path fill="#32B1E8" d="M131 19a42 42 0 0 1 15 8c18 12 36 26 50 43l2 3c26 29 41 64 47 102v2l1 20h-49v10l-42 4a70897 70897 0 0 0-78 7h-3l-18 1a804 804 0 0 0 55-186c16 8 29 33 39 48l-2-16-1-3c-3-14-9-27-15-40l-1-3Z"/>
|
|
378
|
+
<path fill="#1F3AB7" d="M111 33c13 6 23 25 32 37l1 2 4 6 1 2c6 8 4 20 4 30v3c0 32-11 62-26 89h2c23-3 45-4 68-4v9l-42 4a70897 70897 0 0 0-78 7h-3l-18 1a804 804 0 0 0 55-186Z"/>
|
|
379
|
+
<path fill="#3C4856" d="M267 214a2941 2941 0 0 0-12 14l-2 1-10 10-5 4-2 2a8522 8522 0 0 1-21 20c-6 7-11 9-20 10-7 0-12-1-17-6l-8-7-5-6a120 120 0 0 1-8-7l-2-2-4-1-10 7a4157 4157 0 0 1-15 14l-1 1c-5 5-9 6-16 6h-3a397 397 0 0 1-15 0c-14 0-14 0-19-3l-4-7a322 322 0 0 0-8-12l-2-3-8-15 65-7 15-1a47903 47903 0 0 1 122-11l2-1h13Z"/>
|
|
380
|
+
<path fill="#1B87DF" d="M152 86v2l1 2 3 1 3 5 2 4 2 3 2 4c11 21 11 21 14 30l2 4v2l3 7 6 18 5 19 2 9h44v1h-3l-64 2h-3a526 526 0 0 0-44 3l4-9a190 190 0 0 0 21-94V86Z"/>
|
|
381
|
+
<path fill="#1A279D" d="M139 71c5 1 5 1 7 4l2 3 2 3c5 9 3 20 3 29v3c0 32-11 62-26 89h2c23-3 45-4 68-4v9a798 798 0 0 1-92 7l2-2 1-5 5-9c8-16 14-32 19-49l2-8 2-14 1-1c3-18 2-37 2-55Z"/>
|
|
382
|
+
<path fill="#3D4856" d="M151 261c4 1 6 3 8 5l3 3 3 5-4 1-1 19h-18v-20h-7l5-5 2-2 3-2 2-3 4-1Z"/>
|
|
383
|
+
<path fill="#2EB4EB" d="m254 65 4 6c4 6 8 9 14 12v2l-2 1c-7 4-11 9-15 16l-5-7c-3-6-9-8-15-10l7-5c6-4 9-9 12-15Z"/>
|
|
384
|
+
<path fill="#2021AB" d="M162 206h4c10 0 10 0 15 2v1a11602 11602 0 0 1-44 4h-4l-23 1v-1h9l1-3 8-1 3-1h9l2-1 5-1h15Z"/>
|
|
385
|
+
<path fill="#31B8EF" d="M280 50c3 1 3 1 5 4s4 5 8 7l-5 5-6 7-5-5-7-6 6-5 4-7Z"/>
|
|
386
|
+
<path fill="#2DC1F2" d="m255 35 8 9-6 7c-5-1-6-3-9-6l7-10Z"/>
|
|
387
|
+
<path fill="#2F3A48" d="M157 266c3 1 6 3 8 6v2l-4 1-1 19h-18v-18h1v7l1 4 1 4h7l7 1v-12l-1-3v-7l-1-4Z"/>
|
|
388
|
+
<path fill="#233143" d="M157 266c3 1 6 3 8 6v2l-4 1-1 19h-1v-13l-1-4v-6l-1-5Z"/>
|
|
389
|
+
<path fill="#2A2DB3" d="m179 207 2 2-9 1h-7l-4-2c4-4 13-2 18-1Z"/>
|
|
390
|
+
<path fill="#3864CC" d="m104 69 2 6-1 2v3l-1 2-1 2-1 6-2 1 4-22Z"/>
|
|
391
|
+
<path fill="#1F2DAB" d="m77 166 3 1-1 8-5 1c1-4 1-7 3-10Z"/>
|
|
392
|
+
<path fill="#2651C8" d="M98 95c3 3 3 3 3 6v2l-3 1v2h-2l2-11Z"/>
|
|
393
|
+
<path fill="#383F59" d="m267 214-3 5-1-3-9 1 1-2 12-1Z"/>
|
|
394
|
+
<path fill="#184FCF" d="m111 33 4 2-1 2c-2 3-3 5-3 9l-2-1 2-12Z"/>
|
|
395
|
+
<path fill="#1D25A8" d="M71 182h1v8l-4 2c1-7 1-7 3-10Z"/>
|
|
396
|
+
<path fill="#31BBF6" d="m254 65 4 8-3-1-1-2-1 2h-2l3-7Z"/>
|
|
397
|
+
<path fill="#1E78DC" d="m142 168 2 3-2 5-1 2-3 3 1-5 1-3 2-5Z"/>
|
|
398
|
+
<path fill="#42CDF8" d="m255 35 4 4h-2l-7 3 5-7Z"/>
|
|
399
|
+
<path fill="#25B4EC" d="M148 59h4l-2 8c-2-2-2-2-2-5v-3Z"/>
|
|
400
|
+
<path fill="#2024AA" d="m63 200 2 2-1 4-3 2 2-8Z"/>
|
|
401
|
+
<path fill="#32BEFA" d="m280 50 3 1-1 4-3 1 1-6Z"/>
|
|
402
|
+
</svg>
|
|
403
|
+
`)}`;
|
|
404
|
+
/**
|
|
405
|
+
* Built-in skins that ship with the WalletConnect adapter.
|
|
406
|
+
* PRs to add new WalletConnect-compatible wallets should add entries here.
|
|
407
|
+
*/
|
|
408
|
+
const BUILTIN_SKINS = {
|
|
409
|
+
biatec: {
|
|
410
|
+
id: "biatec",
|
|
411
|
+
name: "Biatec Wallet",
|
|
412
|
+
icon: `data:image/svg+xml;base64,${btoa(`
|
|
413
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 180"><path d="M94.27 151.629c-.861-.526-1.51-1.37-1.83-2.386-.197-.62-.18-.627 1.082-.437.705.105 1.6.356 1.988.557.696.36 1.815 1.876 1.815 2.459 0 .486-2.166.348-3.054-.193m23.953-.263c-.788-.419-2.095-2.123-2.108-2.75-.01-.433 2.467-.182 3.403.345.955.536 2.148 1.97 2.148 2.582 0 .503-2.397.38-3.443-.177m-9.024-1.165c-1.567-1.193-2.38-2.74-2.55-4.849-.075-.933-.054-1.697.045-1.697.866 0 2.714 1.67 3.439 3.107.398.789.657 3.888.351 4.195-.07.07-.648-.27-1.285-.756m-8.906-1.354c-.63-.684-1.21-1.648-1.387-2.305-.318-1.18-.136-3.416.278-3.416.555 0 2.108 1.697 2.505 2.737.472 1.237.457 3.905-.023 4.063-.16.053-.777-.433-1.373-1.08m-6.805-1.775c-2.764-.612-5.223-1.425-5.357-1.772-.08-.21.169-1.027.555-1.814s.701-1.469.701-1.515c0-.047-.803.067-1.786.253-.982.185-1.857.256-1.944.157-.088-.1-.365-.715-.618-1.367-.252-.652-.858-1.729-1.345-2.393-1.293-1.76-5.285-5.526-7.272-6.858-3.826-2.564-4.96-3.855-4.667-5.316.08-.402.692-1.574 1.359-2.606 1.65-2.551 2.51-4.472 2.512-5.62.002-.571-.364-1.69-.901-2.758l-.905-1.796.706-.532c1.936-1.46 4.649-4.916 4.205-5.36-.06-.06-.846.72-1.745 1.732-3.553 3.997-7.814 6.463-16.014 9.27-5.324 1.823-5.853 2.06-7.183 3.228-1.555 1.365-1.962 2.502-2.531 7.063-.284 2.275-.706 4.79-.937 5.591-.231.8-.403 2.17-.382 3.043.032 1.346-.157 2.06-1.248 4.698-1.498 3.622-1.068 3.708-4.138-.827l-2.036-3.008.747-.784c.411-.43 1.075-.978 1.475-1.216.955-.568.919-.922-.236-2.331-.53-.647-.917-1.209-.86-1.25s.43-.277.83-.526c1.788-1.12 2.7-4.727 2.987-11.822.214-5.274.595-6.46 2.195-6.83 6.634-1.535 7.58-1.98 8.618-4.066.926-1.858.9-3.701-.121-8.475-.87-4.072-1.047-7.21-.516-9.223.606-2.303 3.759-7.433 5.667-9.221.376-.353.684-.729.684-.835 0-.254-3.325-2.697-4.448-3.268-.482-.245-1.455-.45-2.163-.456-3.892-.03-6.628 1.877-8.722 6.08-.603 1.212-1.582 2.73-2.176 3.374-2.733 2.965-8.602 4.09-12.666 2.43l-.913-.374 1.323-.05c1.422-.054 3.498-.94 3.944-1.683.414-.69.076-.79-1.06-.314-1.443.605-4.075.597-5.039-.015-1.259-.8-2.23-1.81-2.795-2.908l-.535-1.042 1.243 1.095c1.51 1.328 2.691 1.752 4.425 1.585 1.506-.145 2.523-.851 1.65-1.147-3.195-1.08-5.834-3.078-7.07-5.35-.809-1.485-1.513-3.982-1.504-5.334l.006-.936.42.854c.232.47.941 1.333 1.576 1.918l1.155 1.064 2.189-.012 2.188-.011-1.012-.535c-.975-.514-3.353-2.766-3.353-3.175 0-.11.506.079 1.124.418 1.282.703 3.888 1.32 4.21.996.12-.118-.204-.612-.718-1.097-.513-.484-1.17-1.344-1.46-1.911l-.525-1.03 1.174.895c2.02 1.542 3.883 1.506 6.342-.123.69-.457 1.218-.863 1.175-.903s-.989.227-2.103.594c-1.87.618-2.11.64-3.151.305-1.284-.415-2.023-1.273-2.25-2.613l-.158-.926.486.595c1.07 1.31 2.652 1.255 6.363-.224 1.132-.451 2.892-1.036 3.91-1.3 2.732-.706 1.561-.926-2.298-.43-1.778.228-3.27.376-3.318.329-.047-.047.662-.415 1.575-.818 2.002-.883 4.78-1.152 6.858-.663 1.817.427 2.555.81 4.032 2.087 1.151.997 3.654 2.156 4.605 2.133.595-.015-2.96-3.395-4.552-4.328-1.639-.96-4.11-1.542-6.107-1.438-.92.049-1.627.016-1.571-.073.242-.388 3.44-.825 5.203-.71 4.048.265 6.96 2.546 10.902 8.537 2.553 3.883 4.234 5.67 6.137 6.524l1.092.49 2.215-1.027c4.747-2.2 8.797-2.518 16.097-1.26 2.25.387 4.717.704 5.482.704h1.39l.074 3.203.074 3.203.894-1.113c.88-1.096.894-1.152.846-3.516l-.049-2.402-1.61-1.721c-4.14-4.425-4.335-6.536-1.135-12.213 2.744-4.87 2.704-4.41.813-9.32-.883-2.292-1.696-4.167-1.807-4.167-.339 0-.205 4 .196 5.821.716 3.256.435 4.822-1.006 5.603-.371.2-2.144.33-4.904.36-3.6.036-4.348-.022-4.473-.348-.087-.227.102-.582.451-.845.53-.4.563-.53.274-1.09-.18-.35-.692-1.022-1.137-1.493s-.734-.933-.64-1.026c.093-.094 1.072-.036 2.175.128 3.023.45 3.76.398 4.211-.297.4-.615 2.887-9.725 2.704-9.907-.196-.196-1.55 1.62-2.759 3.7-1.782 3.068-3.14 3.895-6.379 3.889-2.485-.005-5.43-1.098-8.658-3.213-1.439-.943-3.02-1.855-3.514-2.027-1.524-.531-3.75-.392-5.163.324l-1.26.638.567-.603c.892-.95 3.048-2.004 4.432-2.167 1.94-.23 3.3.283 5.786 2.18 2.39 1.823 3.163 2.225 4.28 2.225.6 0 .497-.12-.745-.872-.792-.48-2.416-1.598-3.609-2.486-2.658-1.978-4.119-2.58-5.831-2.4l-1.26.132.926-.39c.667-.281 1.609-.36 3.373-.284 1.346.059 2.448.077 2.448.04 0-.278-2.537-1.455-3.71-1.722-.89-.202-1.231-.365-.884-.421.312-.051 1.86.225 3.44.614 2.564.63 3.167.687 5.602.525 5.536-.369 7.032-1.144 9.218-4.774l1.433-2.382-1.224 1.323c-.673.728-1.779 1.928-2.457 2.666-.677.739-1.53 1.417-1.893 1.508l-.662.165.61-.503c.334-.277 1.088-1.491 1.675-2.698 1.772-3.648 3.228-4.779 6.772-5.257 3.522-.476 4.797-.791 5.421-1.342.332-.293.429-.44.215-.329-.213.112-1.94.277-3.836.367-2.955.14-3.666.263-4.97.86-1.632.749-4.092 2.893-4.996 4.356-.764 1.236-.923.905-.224-.465 1.387-2.718 4.685-4.945 8.366-5.651l1.815-.349-1.058-.235c-.582-.13-1.952-.224-3.043-.209l-1.984.027 1.72-.82c1.427-.682 2.04-.822 3.611-.822 1.607 0 1.86-.06 1.679-.4-.539-1.005-1.377-1.452-2.69-1.432-.769.011-1.156-.067-.937-.19.534-.298 2.168-.34 4.169-.104 1.648.194 1.82.159 3.59-.733 1.023-.515 2.472-1.047 3.22-1.183 1.388-.253 3.607-.04 4.472.429.942.51 1.958 1.825 2.095 2.712.116.746 0 1.052-.671 1.777-.752.813-.811 1.018-.811 2.82 0 1.706-.105 2.127-.85 3.424-.467.814-.973 1.476-1.124 1.473s-.797-.242-1.435-.532c-1.277-.579-1.714-.435-1.988.655-.115.46.045.84.605 1.44.42.448 1.621 2.237 2.671 3.975 1.883 3.116 1.905 3.175 1.585 4.146-.258.78-.258 1.56 0 3.73.179 1.51.253 3.031.166 3.38-.128.509.033.795.805 1.432 1.367 1.126 5.02 2.947 5.914 2.947 1.268 0 1.588.247 1.588 1.227 0 1.057-.642 2.742-1.045 2.742-.153 0-.278-.298-.278-.662 0-.558-.123-.661-.793-.661-.436 0-2.162-.467-3.836-1.036l-3.044-1.036v1.788c0 .984-.077 3.057-.172 4.608l-.173 2.82h3.015l-.133.86c-.073.472-.206 2.11-.295 3.637-.373 6.42-.634 7.203-4.207 12.65-4.119 6.278-4.635 7.984-3.493 11.548.37 1.158.647 2.133.613 2.167-.246.246-2.569-1.19-3.783-2.34-2.616-2.473-2.922-3.975-1.146-5.619.954-.882 1.054-1.087.892-1.828-.417-1.91-.553-1.976-1-.482-.232.777-.693 1.849-1.024 2.382-.526.846-.603 1.318-.603 3.705v2.736l3.175 1.022c1.746.562 3.446 1.028 3.777 1.034.583.012.59-.012.194-.776-.224-.434-.479-1.307-.566-1.939-.208-1.523.53-3.065 3.905-8.159 4.537-6.845 5.478-9.25 5.681-14.513.07-1.82.19-3.93.267-4.692.137-1.353.17-1.398 1.379-1.933 2.27-1.004 4.245-3.717 6.253-8.589.526-1.274.459-1.204-1.891 1.985-1.019 1.382-2.13 2.751-2.47 3.042-.604.516-.603.506.048-.397.938-1.299 1.216-2.144 1.685-5.107.663-4.193 1.699-6.255 4.604-9.16 3.639-3.638 9.47-6.348 13.7-6.365.635-.003 1.201-.155 1.322-.356.117-.192 1.105-.92 2.196-1.615 1.092-.696 2.252-1.511 2.579-1.812.327-.3.66-.48.74-.4.081.081-.038.942-.263 1.914s-.41 1.88-.41 2.016c0 .37 1.393.3 1.992-.102.287-.192 1.296-.62 2.241-.953s1.998-.78 2.338-.994c.34-.215.665-.345.722-.288.302.302-1.982 3.526-2.927 4.132l-1.152.74c-.277.179 1.202 3.732 1.975 4.745.674.882.862 1.347.742 1.825-.089.354.045 1.273.296 2.044.645 1.98 2.913 6.751 3.698 7.779.808 1.06.82 1.416.075 2.363-.32.408-.648 1.225-.728 1.816-.118.879-.279 1.12-.89 1.335-1.457.512-2.298-.449-2.94-3.358-.113-.512-.325-.728-.715-.728-.634 0-.619.099.398 2.514.368.873.572 1.685.453 1.804-.12.119-.679.178-1.244.132-1.006-.082-1.03-.108-1.165-1.29-.11-.958-.407-1.515-1.444-2.716-1.28-1.483-1.523-1.617-3.974-2.186-.436-.102-1.235-.406-1.776-.677l-.981-.491-.311 1.124c-.462 1.668-.381 7.592.14 10.35.244 1.29.926 3.552 1.516 5.027 1.864 4.655 1.933 4.98 1.924 9.031-.006 2.853-.112 3.972-.461 4.87-.25.641-.415 1.204-.367 1.252.047.047 2.935.203 6.419.347 4.2.174 6.786.397 7.679.664 1.433.429 2.955 1.341 3.328 1.995.125.219 1.292 3.718 2.594 7.777 2.56 7.978 2.515 7.613 1.142 9.263-.582.7-.623.918-.458 2.455l.18 1.686-1.685 1.59c-2.476 2.335-2.487 2.338-2.833.702l-.825-3.894c-.497-2.344-.503-2.535-.09-2.844.245-.182.75-.332 1.121-.335 1.259-.007 1.444-.36.672-1.277l-.7-.833.461-1.209c.403-1.054.421-1.428.146-2.924-.856-4.647-3.463-7.755-6.516-7.769-1.198-.006-5.626.726-6.143 1.015-.419.235 1.36 2.035 4.026 4.073 1.954 1.494 2.487 2.265 2.708 3.918.115.858-.031 1.278-.963 2.753-1.122 1.776-2.596 4.941-4.015 8.62-.437 1.133-1.048 2.383-1.358 2.777-.546.695-.623.712-2.434.544-1.51-.14-2.034-.085-2.726.287-.933.503-1.032.488-5.234-.754l-1.852-.547 1.058-.93c2.452-2.155 4.96-4.035 5.375-4.028.245.004.743.417 1.107.919.364.5.74.914.835.918.336.014 2.673-2.777 3.423-4.09.928-1.622 1.429-3.721 1.19-4.992-.414-2.208-2.105-3.2-8.836-5.183-4.604-1.356-5.44-1.637-6.837-2.3-.81-.384-.92-.36-3.047.664-2.593 1.248-5.507 2.251-8.665 2.983-3.304.766-9.686.95-12.988.376-3.227-.562-7.639-2.035-9.626-3.214-.856-.508-1.618-.862-1.693-.787-.15.15 1.12 2.079 1.665 2.53.271.226.239.732-.166 2.586-1.245 5.713-2.66 8.612-7.189 14.73-2.852 3.852-3.402 5.685-2.327 7.762.66 1.274 9.278 9.763 11.016 10.85.797.498 1.576 1.26 1.929 1.889.496.883 2.158 5.275 2.158 5.704 0 .2-1.577.111-2.779-.154" style="fill:teal;stroke-width:.264583"></path></svg>
|
|
414
|
+
`)}`
|
|
415
|
+
},
|
|
416
|
+
voiwallet: {
|
|
417
|
+
id: "voiwallet",
|
|
418
|
+
name: "Voi Wallet",
|
|
419
|
+
icon: VOI_WALLET_ICON
|
|
420
|
+
}
|
|
421
|
+
};
|
|
422
|
+
/**
|
|
423
|
+
* Runtime registry for custom skins added by developers.
|
|
424
|
+
* Use `registerSkin()` to add custom skins.
|
|
425
|
+
*/
|
|
426
|
+
const customSkins = /* @__PURE__ */ new Map();
|
|
427
|
+
/**
|
|
428
|
+
* Register a custom WalletConnect skin at runtime.
|
|
429
|
+
* This allows developers to add their own wallet skins without PRing the library.
|
|
430
|
+
*
|
|
431
|
+
* @param skin - The skin definition to register
|
|
432
|
+
* @throws Error if attempting to override a built-in skin
|
|
433
|
+
*
|
|
434
|
+
* @example
|
|
435
|
+
* ```typescript
|
|
436
|
+
* import { registerSkin } from '@txnlab/use-wallet-walletconnect'
|
|
437
|
+
*
|
|
438
|
+
* registerSkin({
|
|
439
|
+
* id: 'mywallet',
|
|
440
|
+
* name: 'My Custom Wallet',
|
|
441
|
+
* icon: 'data:image/svg+xml;base64,...'
|
|
442
|
+
* })
|
|
443
|
+
* ```
|
|
444
|
+
*/
|
|
445
|
+
function registerSkin(skin) {
|
|
446
|
+
if (BUILTIN_SKINS[skin.id]) throw new Error(`Cannot override built-in skin: ${skin.id}`);
|
|
447
|
+
customSkins.set(skin.id, skin);
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Get a skin by its ID from either built-in or custom registries.
|
|
451
|
+
*
|
|
452
|
+
* @param skinId - The skin identifier
|
|
453
|
+
* @returns The skin definition, or undefined if not found
|
|
454
|
+
*/
|
|
455
|
+
function getSkin(skinId) {
|
|
456
|
+
return BUILTIN_SKINS[skinId] || customSkins.get(skinId);
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Resolve a skin option to a full WalletConnectSkin object.
|
|
460
|
+
*
|
|
461
|
+
* If the option is a string, looks up the skin in the registries.
|
|
462
|
+
* If the option is a full skin object, registers it as a custom skin and returns it.
|
|
463
|
+
*
|
|
464
|
+
* @param skinOption - Either a skin ID string or a full skin definition
|
|
465
|
+
* @returns The resolved skin, or undefined if not found (when string ID provided)
|
|
466
|
+
*/
|
|
467
|
+
function resolveSkin(skinOption) {
|
|
468
|
+
if (typeof skinOption === "string") return getSkin(skinOption);
|
|
469
|
+
if (!BUILTIN_SKINS[skinOption.id]) customSkins.set(skinOption.id, skinOption);
|
|
470
|
+
return skinOption;
|
|
471
|
+
}
|
|
472
|
+
//#endregion
|
|
473
|
+
//#region src/index.ts
|
|
474
|
+
const WALLET_ID = "walletconnect";
|
|
475
|
+
function walletConnect(options) {
|
|
476
|
+
const skin = options.skin ? resolveSkin(options.skin) : null;
|
|
477
|
+
return {
|
|
478
|
+
id: skin ? `walletconnect:${skin.id}` : WALLET_ID,
|
|
479
|
+
metadata: skin ? {
|
|
480
|
+
name: skin.name,
|
|
481
|
+
icon: skin.icon
|
|
482
|
+
} : WalletConnectAdapter.defaultMetadata,
|
|
483
|
+
Adapter: WalletConnectAdapter,
|
|
484
|
+
options
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
//#endregion
|
|
488
|
+
export { BUILTIN_SKINS, SessionError, WALLET_ID, WalletConnectAdapter, getSkin, registerSkin, resolveSkin, walletConnect };
|
|
489
|
+
|
|
490
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/icon.ts","../src/adapter.ts","../src/skins.ts","../src/index.ts"],"sourcesContent":["export const icon = `\n<svg viewBox=\"0 0 480 480\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect width=\"480\" height=\"480\" fill=\"#FFFFFF\" />\n <path fill=\"#3396FF\" d=\"M126.6,168c62.6-61.3,164.2-61.3,226.8,0l7.5,7.4c3.1,3.1,3.1,8,0,11.1l-25.8,25.2c-1.6,1.5-4.1,1.5-5.7,0l-10.4-10.2c-43.7-42.8-114.5-42.8-158.2,0l-11.1,10.9c-1.6,1.5-4.1,1.5-5.7,0l-25.8-25.2c-3.1-3.1-3.1-8,0-11.1L126.6,168zM406.7,220.2l22.9,22.5c3.1,3.1,3.1,8,0,11.1L326.2,355.1c-3.1,3.1-8.2,3.1-11.3,0l-73.4-71.9c-0.8-0.8-2.1-0.8-2.8,0l-73.4,71.9c-3.1,3.1-8.2,3.1-11.3,0L50.3,253.8c-3.1-3.1-3.1-8,0-11.1l22.9-22.5c3.1-3.1,8.2-3.1,11.3,0l73.4,71.9c0.8,0.8,2.1,0.8,2.8,0 l73.4-71.9c3.1-3.1,8.2-3.1,11.3,0l73.4,71.9c0.8,0.8,2.1,0.8,2.8,0l73.4-71.9C398.5,217.1,403.6,217.1,406.7,220.2L406.7,220.2z\" />\n</svg>\n`\n","import algosdk from 'algosdk'\nimport {\n BaseWallet,\n base64ToByteArray,\n byteArrayToBase64,\n compareAccounts,\n flattenTxnGroup,\n formatJsonRpcRequest,\n isSignedTxn,\n isTransactionArray,\n type AdapterConstructorParams,\n type WalletAccount,\n type WalletMetadata,\n type WalletState,\n type WalletTransaction\n} from '@txnlab/use-wallet/adapter'\nimport type { WalletConnectModal, WalletConnectModalConfig } from '@walletconnect/modal'\nimport type SignClient from '@walletconnect/sign-client'\nimport type { SessionTypes, SignClientTypes } from '@walletconnect/types'\nimport type { WalletConnectSkinOption } from './skins'\n\ninterface SignClientOptions {\n projectId: string\n relayUrl?: string\n metadata?: SignClientTypes.Metadata\n}\n\ntype WalletConnectModalOptions = Pick<\n WalletConnectModalConfig,\n | 'enableExplorer'\n | 'explorerRecommendedWalletIds'\n | 'privacyPolicyUrl'\n | 'termsOfServiceUrl'\n | 'themeMode'\n | 'themeVariables'\n>\n\ntype WalletConnectBaseOptions = SignClientOptions & WalletConnectModalOptions\n\nexport interface WalletConnectOptions extends WalletConnectBaseOptions {\n /**\n * Optional skin to apply to this WalletConnect instance.\n * Can be either:\n * - A string ID referencing a built-in skin (e.g., 'biatec')\n * - A full skin object with id, name, and icon\n *\n * When a skin is applied, the wallet will use the skin's metadata\n * and a unique walletKey for state isolation.\n */\n skin?: WalletConnectSkinOption\n}\n\nexport type SignTxnsResponse = Array<Uint8Array | number[] | string | null | undefined>\n\nexport class SessionError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'SessionError'\n }\n}\n\nimport { icon } from './icon'\n\nconst ICON = `data:image/svg+xml;base64,${btoa(icon)}`\n\nexport class WalletConnectAdapter extends BaseWallet<WalletConnectOptions> {\n private client: SignClient | null = null\n private clientOptions: SignClientOptions\n private modal: WalletConnectModal | null = null\n private modalOptions: WalletConnectModalOptions\n private session: SessionTypes.Struct | null = null\n\n constructor(params: AdapterConstructorParams<WalletConnectOptions>) {\n super(params)\n\n if (!this.options?.projectId) {\n this.logger.error('Missing required option: projectId')\n throw new Error('Missing required option: projectId')\n }\n\n const {\n projectId,\n relayUrl = 'wss://relay.walletconnect.com',\n metadata: metadataOptions,\n\n skin: _skinOption, // Extract skin to exclude from modalOptions\n ...modalOptions\n } = this.options\n\n const clientMetadata: SignClientTypes.Metadata = {\n ...this.getWindowMetadata(),\n ...metadataOptions\n }\n\n this.clientOptions = {\n projectId,\n relayUrl,\n metadata: clientMetadata\n }\n\n this.modalOptions = modalOptions\n }\n\n static defaultMetadata: WalletMetadata = {\n name: 'WalletConnect',\n icon: ICON\n }\n\n /**\n * Get metadata from the current window. This is adapted from the @walletconnect/utils\n * implementation, to avoid requiring the entire package as a dependency.\n * @see https://github.com/WalletConnect/walletconnect-utils/blob/master/browser/window-metadata/src/index.ts\n */\n private getWindowMetadata(): SignClientTypes.Metadata {\n let doc: Document\n let loc: Location\n\n const defaultMetadata = {\n name: '',\n description: '',\n url: '',\n icons: []\n }\n\n function getFromWindow<T>(name: string): T | undefined {\n let res: T | undefined\n if (typeof window !== 'undefined' && typeof (window as any)[name] !== 'undefined') {\n res = (window as any)[name]\n }\n return res\n }\n\n function getFromWindowOrThrow<T>(name: string): T {\n const res = getFromWindow<T>(name)\n if (!res) {\n throw new Error(`${name} is not defined in Window`)\n }\n return res\n }\n\n function getDocumentOrThrow(): Document {\n return getFromWindowOrThrow<Document>('document')\n }\n\n function getLocationOrThrow(): Location {\n return getFromWindowOrThrow<Location>('location')\n }\n\n try {\n doc = getDocumentOrThrow()\n loc = getLocationOrThrow()\n } catch (error) {\n this.logger.warn('Error getting window metadata:', error)\n return defaultMetadata\n }\n\n function getIcons(): string[] {\n const links: HTMLCollectionOf<HTMLLinkElement> = doc.getElementsByTagName('link')\n const icons: string[] = []\n\n for (let i = 0; i < links.length; i++) {\n const link: HTMLLinkElement = links[i]\n\n const rel: string | null = link.getAttribute('rel')\n if (rel) {\n if (rel.toLowerCase().indexOf('icon') > -1) {\n const href: string | null = link.getAttribute('href')\n\n if (href) {\n if (\n href.toLowerCase().indexOf('https:') === -1 &&\n href.toLowerCase().indexOf('http:') === -1 &&\n href.indexOf('//') !== 0\n ) {\n let absoluteHref: string = loc.protocol + '//' + loc.host\n\n if (href.indexOf('/') === 0) {\n absoluteHref += href\n } else {\n const path: string[] = loc.pathname.split('/')\n path.pop()\n const finalPath: string = path.join('/')\n absoluteHref += finalPath + '/' + href\n }\n\n icons.push(absoluteHref)\n } else if (href.indexOf('//') === 0) {\n const absoluteUrl: string = loc.protocol + href\n\n icons.push(absoluteUrl)\n } else {\n icons.push(href)\n }\n }\n }\n }\n }\n\n return icons\n }\n\n function getWindowMetadataOfAny(...args: string[]): string {\n const metaTags: HTMLCollectionOf<HTMLMetaElement> = doc.getElementsByTagName('meta')\n\n for (let i = 0; i < metaTags.length; i++) {\n const tag: HTMLMetaElement = metaTags[i]\n const attributes: Array<string | null> = ['itemprop', 'property', 'name']\n .map((target: string) => tag.getAttribute(target))\n .filter((attr: string | null) => {\n if (attr) {\n return args.includes(attr)\n }\n return false\n })\n\n if (attributes.length && attributes) {\n const content: string | null = tag.getAttribute('content')\n if (content) {\n return content\n }\n }\n }\n\n return ''\n }\n\n function getName(): string {\n let name: string = getWindowMetadataOfAny('name', 'og:site_name', 'og:title', 'twitter:title')\n\n if (!name) {\n name = doc.title\n }\n\n return name\n }\n\n function getDescription(): string {\n const description: string = getWindowMetadataOfAny(\n 'description',\n 'og:description',\n 'twitter:description',\n 'keywords'\n )\n\n return description\n }\n\n const name: string = getName()\n const description: string = getDescription()\n const url: string = loc.origin\n const icons: string[] = getIcons()\n\n const meta: SignClientTypes.Metadata = {\n description,\n url,\n icons,\n name\n }\n\n return meta\n }\n\n private async initializeClient(): Promise<SignClient> {\n this.logger.info('Initializing client...')\n const SignClient = (await import('@walletconnect/sign-client')).SignClient\n const client = await SignClient.init(this.clientOptions)\n\n client.on('session_event', (args) => {\n this.logger.info('EVENT: session_event', args)\n })\n\n client.on('session_update', ({ topic, params }) => {\n this.logger.info('EVENT: session_update', { topic, params })\n const { namespaces } = params\n const session = client.session.get(topic)\n const updatedSession = { ...session, namespaces }\n this.onSessionConnected(updatedSession)\n })\n\n client.on('session_delete', () => {\n this.logger.info('EVENT: session_delete')\n this.session = null\n })\n\n this.client = client\n this.logger.info('Client initialized')\n return client\n }\n\n private async initializeModal(): Promise<WalletConnectModal> {\n this.logger.info('Initializing modal...')\n const WalletConnectModal = (await import('@walletconnect/modal')).WalletConnectModal\n const modal = new WalletConnectModal({\n projectId: this.clientOptions.projectId,\n ...this.modalOptions\n })\n\n modal.subscribeModal((state) => this.logger.info(`Modal ${state.open ? 'open' : 'closed'}`))\n\n this.modal = modal\n this.logger.info('Modal initialized')\n return modal\n }\n\n private onSessionConnected(session: SessionTypes.Struct): WalletAccount[] {\n const caipAccounts = session.namespaces.algorand!.accounts\n\n if (!caipAccounts.length) {\n this.logger.error('No accounts found!')\n throw new Error('No accounts found!')\n }\n\n // @todo: Validate format of CAIP-10 accounts\n\n // Filter duplicate accounts (same address, different chain)\n const accounts = [...new Set(caipAccounts.map((account) => account.split(':').pop()!))]\n\n const walletAccounts = accounts.map((address: string, idx: number) => ({\n name: `${this.metadata.name} Account ${idx + 1}`,\n address\n }))\n\n const walletState = this.store.getWalletState()\n\n if (!walletState) {\n const newWalletState: WalletState = {\n accounts: walletAccounts,\n activeAccount: walletAccounts[0]\n }\n\n this.store.addWallet(newWalletState)\n\n this.logger.info('Connected', newWalletState)\n } else {\n const match = compareAccounts(walletAccounts, walletState.accounts)\n\n if (!match) {\n this.logger.warn('Session accounts mismatch, updating accounts', {\n prev: walletState.accounts,\n current: walletAccounts\n })\n this.store.setAccounts(walletAccounts)\n }\n }\n\n this.session = session\n return walletAccounts\n }\n\n public get activeChainId(): string {\n const network = this.activeNetworkConfig\n if (!network?.caipChainId) {\n this.logger.warn(`No CAIP-2 chain ID found for network: ${this.activeNetwork}`)\n return ''\n }\n return network.caipChainId\n }\n\n public connect = async (): Promise<WalletAccount[]> => {\n this.logger.info('Connecting...')\n try {\n const client = this.client || (await this.initializeClient())\n const modal = this.modal || (await this.initializeModal())\n\n const requiredNamespaces = {\n algorand: {\n chains: [this.activeChainId],\n methods: ['algo_signTxn'],\n events: []\n }\n }\n\n const { uri, approval } = await client.connect({ requiredNamespaces })\n\n if (!uri) {\n this.logger.error('No URI found')\n throw new Error('No URI found')\n }\n\n await modal.openModal({ uri })\n\n const session = await approval()\n const walletAccounts = this.onSessionConnected(session)\n\n this.logger.info('Connected successfully')\n return walletAccounts\n } catch (error: any) {\n this.logger.error('Error connecting:', error.message)\n throw error\n } finally {\n this.modal?.closeModal()\n }\n }\n\n public disconnect = async (): Promise<void> => {\n this.logger.info('Disconnecting...')\n try {\n this.onDisconnect()\n if (this.client && this.session) {\n await this.client.disconnect({\n topic: this.session.topic,\n reason: {\n message: 'User disconnected.',\n code: 6000\n }\n })\n }\n this.logger.info('Disconnected')\n } catch (error: any) {\n this.logger.error('Error disconnecting:', error.message)\n throw error\n }\n }\n\n public resumeSession = async (): Promise<void> => {\n try {\n const walletState = this.store.getWalletState()\n\n // No session to resume\n if (!walletState) {\n this.logger.info('No session to resume')\n return\n }\n\n this.logger.info('Resuming session...')\n\n const client = this.client || (await this.initializeClient())\n\n if (client.session.length) {\n const lastKeyIndex = client.session.keys.length - 1\n const restoredSession = client.session.get(client.session.keys[lastKeyIndex])\n this.onSessionConnected(restoredSession)\n }\n this.logger.info('Session resumed successfully')\n } catch (error: any) {\n this.logger.error('Error resuming session:', error.message)\n this.onDisconnect()\n throw error\n }\n }\n\n private processTxns(\n txnGroup: algosdk.Transaction[],\n indexesToSign?: number[]\n ): WalletTransaction[] {\n const txnsToSign: WalletTransaction[] = []\n\n txnGroup.forEach((txn, index) => {\n const isIndexMatch = !indexesToSign || indexesToSign.includes(index)\n const signer = txn.sender.toString()\n const canSignTxn = this.addresses.includes(signer)\n\n const txnString = byteArrayToBase64(txn.toByte())\n\n if (isIndexMatch && canSignTxn) {\n txnsToSign.push({ txn: txnString })\n } else {\n txnsToSign.push({ txn: txnString, signers: [] })\n }\n })\n\n return txnsToSign\n }\n\n private processEncodedTxns(\n txnGroup: Uint8Array[],\n indexesToSign?: number[]\n ): WalletTransaction[] {\n const txnsToSign: WalletTransaction[] = []\n\n txnGroup.forEach((txnBuffer, index) => {\n const decodedObj = algosdk.msgpackRawDecode(txnBuffer)\n const isSigned = isSignedTxn(decodedObj)\n\n const txn: algosdk.Transaction = isSigned\n ? algosdk.decodeSignedTransaction(txnBuffer).txn\n : algosdk.decodeUnsignedTransaction(txnBuffer)\n\n const isIndexMatch = !indexesToSign || indexesToSign.includes(index)\n const signer = txn.sender.toString()\n const canSignTxn = !isSigned && this.addresses.includes(signer)\n\n const txnString = byteArrayToBase64(txn.toByte())\n\n if (isIndexMatch && canSignTxn) {\n txnsToSign.push({ txn: txnString })\n } else {\n txnsToSign.push({ txn: txnString, signers: [] })\n }\n })\n\n return txnsToSign\n }\n\n public signTransactions = async <T extends algosdk.Transaction[] | Uint8Array[]>(\n txnGroup: T | T[],\n indexesToSign?: number[]\n ): Promise<(Uint8Array | null)[]> => {\n try {\n if (!this.session) {\n this.logger.error('No session found!')\n throw new SessionError('No session found!')\n }\n\n this.logger.debug('Signing transactions...', { txnGroup, indexesToSign })\n\n let txnsToSign: WalletTransaction[] = []\n\n // Determine type and process transactions for signing\n if (isTransactionArray(txnGroup)) {\n const flatTxns: algosdk.Transaction[] = flattenTxnGroup(txnGroup)\n txnsToSign = this.processTxns(flatTxns, indexesToSign)\n } else {\n const flatTxns: Uint8Array[] = flattenTxnGroup(txnGroup as Uint8Array[])\n txnsToSign = this.processEncodedTxns(flatTxns, indexesToSign)\n }\n\n const client = this.client || (await this.initializeClient())\n\n this.logger.debug('Sending processed transactions to wallet...', [txnsToSign])\n\n // Format JSON-RPC request\n const request = formatJsonRpcRequest('algo_signTxn', [txnsToSign])\n\n // Sign transactions\n const signTxnsResult = await client.request<SignTxnsResponse>({\n chainId: this.activeChainId,\n topic: this.session.topic,\n request\n })\n\n this.logger.debug('Received signed transactions from wallet', signTxnsResult)\n\n // Filter out unsigned transactions, convert signed transactions to Uint8Array\n const signedTxns = signTxnsResult.reduce<Uint8Array[]>((acc, value) => {\n if (value) {\n let signedTxn: Uint8Array\n if (typeof value === 'string') {\n signedTxn = base64ToByteArray(value)\n } else if (value instanceof Uint8Array) {\n signedTxn = value\n } else if (Array.isArray(value)) {\n signedTxn = new Uint8Array(value)\n } else {\n // Log unexpected types for debugging\n this.logger.warn('Unexpected type in signTxnsResult', value)\n signedTxn = new Uint8Array()\n }\n acc.push(signedTxn)\n }\n return acc\n }, [])\n\n // ARC-0001 - Return null for unsigned transactions\n const result = txnsToSign.reduce<(Uint8Array | null)[]>((acc, txn) => {\n if (txn.signers && txn.signers.length == 0) {\n acc.push(null)\n } else {\n const signedTxn = signedTxns.shift()\n if (signedTxn) {\n acc.push(signedTxn)\n }\n }\n return acc\n }, [])\n\n this.logger.debug('Transactions signed successfully', result)\n return result\n } catch (error: any) {\n this.logger.error('Error signing transactions:', error.message)\n throw error\n }\n }\n}\n","// ---------- Skin Types ---------- //\n\nexport interface WalletConnectSkin {\n id: string\n name: string\n icon: string\n}\n\nexport type WalletConnectSkinOption = string | WalletConnectSkin\n\n// ---------- Built-in Skin Icons ---------- //\n\nconst VOI_WALLET_ICON = `data:image/svg+xml;base64,${btoa(`\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"322\" height=\"322\">\n <path fill=\"#32B1E8\" d=\"M131 19a42 42 0 0 1 15 8c18 12 36 26 50 43l2 3c26 29 41 64 47 102v2l1 20h-49v10l-42 4a70897 70897 0 0 0-78 7h-3l-18 1a804 804 0 0 0 55-186c16 8 29 33 39 48l-2-16-1-3c-3-14-9-27-15-40l-1-3Z\"/>\n <path fill=\"#1F3AB7\" d=\"M111 33c13 6 23 25 32 37l1 2 4 6 1 2c6 8 4 20 4 30v3c0 32-11 62-26 89h2c23-3 45-4 68-4v9l-42 4a70897 70897 0 0 0-78 7h-3l-18 1a804 804 0 0 0 55-186Z\"/>\n <path fill=\"#3C4856\" d=\"M267 214a2941 2941 0 0 0-12 14l-2 1-10 10-5 4-2 2a8522 8522 0 0 1-21 20c-6 7-11 9-20 10-7 0-12-1-17-6l-8-7-5-6a120 120 0 0 1-8-7l-2-2-4-1-10 7a4157 4157 0 0 1-15 14l-1 1c-5 5-9 6-16 6h-3a397 397 0 0 1-15 0c-14 0-14 0-19-3l-4-7a322 322 0 0 0-8-12l-2-3-8-15 65-7 15-1a47903 47903 0 0 1 122-11l2-1h13Z\"/>\n <path fill=\"#1B87DF\" d=\"M152 86v2l1 2 3 1 3 5 2 4 2 3 2 4c11 21 11 21 14 30l2 4v2l3 7 6 18 5 19 2 9h44v1h-3l-64 2h-3a526 526 0 0 0-44 3l4-9a190 190 0 0 0 21-94V86Z\"/>\n <path fill=\"#1A279D\" d=\"M139 71c5 1 5 1 7 4l2 3 2 3c5 9 3 20 3 29v3c0 32-11 62-26 89h2c23-3 45-4 68-4v9a798 798 0 0 1-92 7l2-2 1-5 5-9c8-16 14-32 19-49l2-8 2-14 1-1c3-18 2-37 2-55Z\"/>\n <path fill=\"#3D4856\" d=\"M151 261c4 1 6 3 8 5l3 3 3 5-4 1-1 19h-18v-20h-7l5-5 2-2 3-2 2-3 4-1Z\"/>\n <path fill=\"#2EB4EB\" d=\"m254 65 4 6c4 6 8 9 14 12v2l-2 1c-7 4-11 9-15 16l-5-7c-3-6-9-8-15-10l7-5c6-4 9-9 12-15Z\"/>\n <path fill=\"#2021AB\" d=\"M162 206h4c10 0 10 0 15 2v1a11602 11602 0 0 1-44 4h-4l-23 1v-1h9l1-3 8-1 3-1h9l2-1 5-1h15Z\"/>\n <path fill=\"#31B8EF\" d=\"M280 50c3 1 3 1 5 4s4 5 8 7l-5 5-6 7-5-5-7-6 6-5 4-7Z\"/>\n <path fill=\"#2DC1F2\" d=\"m255 35 8 9-6 7c-5-1-6-3-9-6l7-10Z\"/>\n <path fill=\"#2F3A48\" d=\"M157 266c3 1 6 3 8 6v2l-4 1-1 19h-18v-18h1v7l1 4 1 4h7l7 1v-12l-1-3v-7l-1-4Z\"/>\n <path fill=\"#233143\" d=\"M157 266c3 1 6 3 8 6v2l-4 1-1 19h-1v-13l-1-4v-6l-1-5Z\"/>\n <path fill=\"#2A2DB3\" d=\"m179 207 2 2-9 1h-7l-4-2c4-4 13-2 18-1Z\"/>\n <path fill=\"#3864CC\" d=\"m104 69 2 6-1 2v3l-1 2-1 2-1 6-2 1 4-22Z\"/>\n <path fill=\"#1F2DAB\" d=\"m77 166 3 1-1 8-5 1c1-4 1-7 3-10Z\"/>\n <path fill=\"#2651C8\" d=\"M98 95c3 3 3 3 3 6v2l-3 1v2h-2l2-11Z\"/>\n <path fill=\"#383F59\" d=\"m267 214-3 5-1-3-9 1 1-2 12-1Z\"/>\n <path fill=\"#184FCF\" d=\"m111 33 4 2-1 2c-2 3-3 5-3 9l-2-1 2-12Z\"/>\n <path fill=\"#1D25A8\" d=\"M71 182h1v8l-4 2c1-7 1-7 3-10Z\"/>\n <path fill=\"#31BBF6\" d=\"m254 65 4 8-3-1-1-2-1 2h-2l3-7Z\"/>\n <path fill=\"#1E78DC\" d=\"m142 168 2 3-2 5-1 2-3 3 1-5 1-3 2-5Z\"/>\n <path fill=\"#42CDF8\" d=\"m255 35 4 4h-2l-7 3 5-7Z\"/>\n <path fill=\"#25B4EC\" d=\"M148 59h4l-2 8c-2-2-2-2-2-5v-3Z\"/>\n <path fill=\"#2024AA\" d=\"m63 200 2 2-1 4-3 2 2-8Z\"/>\n <path fill=\"#32BEFA\" d=\"m280 50 3 1-1 4-3 1 1-6Z\"/>\n</svg>\n`)}`\n\nconst BIATEC_ICON = `data:image/svg+xml;base64,${btoa(`\n<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 200 180\"><path d=\"M94.27 151.629c-.861-.526-1.51-1.37-1.83-2.386-.197-.62-.18-.627 1.082-.437.705.105 1.6.356 1.988.557.696.36 1.815 1.876 1.815 2.459 0 .486-2.166.348-3.054-.193m23.953-.263c-.788-.419-2.095-2.123-2.108-2.75-.01-.433 2.467-.182 3.403.345.955.536 2.148 1.97 2.148 2.582 0 .503-2.397.38-3.443-.177m-9.024-1.165c-1.567-1.193-2.38-2.74-2.55-4.849-.075-.933-.054-1.697.045-1.697.866 0 2.714 1.67 3.439 3.107.398.789.657 3.888.351 4.195-.07.07-.648-.27-1.285-.756m-8.906-1.354c-.63-.684-1.21-1.648-1.387-2.305-.318-1.18-.136-3.416.278-3.416.555 0 2.108 1.697 2.505 2.737.472 1.237.457 3.905-.023 4.063-.16.053-.777-.433-1.373-1.08m-6.805-1.775c-2.764-.612-5.223-1.425-5.357-1.772-.08-.21.169-1.027.555-1.814s.701-1.469.701-1.515c0-.047-.803.067-1.786.253-.982.185-1.857.256-1.944.157-.088-.1-.365-.715-.618-1.367-.252-.652-.858-1.729-1.345-2.393-1.293-1.76-5.285-5.526-7.272-6.858-3.826-2.564-4.96-3.855-4.667-5.316.08-.402.692-1.574 1.359-2.606 1.65-2.551 2.51-4.472 2.512-5.62.002-.571-.364-1.69-.901-2.758l-.905-1.796.706-.532c1.936-1.46 4.649-4.916 4.205-5.36-.06-.06-.846.72-1.745 1.732-3.553 3.997-7.814 6.463-16.014 9.27-5.324 1.823-5.853 2.06-7.183 3.228-1.555 1.365-1.962 2.502-2.531 7.063-.284 2.275-.706 4.79-.937 5.591-.231.8-.403 2.17-.382 3.043.032 1.346-.157 2.06-1.248 4.698-1.498 3.622-1.068 3.708-4.138-.827l-2.036-3.008.747-.784c.411-.43 1.075-.978 1.475-1.216.955-.568.919-.922-.236-2.331-.53-.647-.917-1.209-.86-1.25s.43-.277.83-.526c1.788-1.12 2.7-4.727 2.987-11.822.214-5.274.595-6.46 2.195-6.83 6.634-1.535 7.58-1.98 8.618-4.066.926-1.858.9-3.701-.121-8.475-.87-4.072-1.047-7.21-.516-9.223.606-2.303 3.759-7.433 5.667-9.221.376-.353.684-.729.684-.835 0-.254-3.325-2.697-4.448-3.268-.482-.245-1.455-.45-2.163-.456-3.892-.03-6.628 1.877-8.722 6.08-.603 1.212-1.582 2.73-2.176 3.374-2.733 2.965-8.602 4.09-12.666 2.43l-.913-.374 1.323-.05c1.422-.054 3.498-.94 3.944-1.683.414-.69.076-.79-1.06-.314-1.443.605-4.075.597-5.039-.015-1.259-.8-2.23-1.81-2.795-2.908l-.535-1.042 1.243 1.095c1.51 1.328 2.691 1.752 4.425 1.585 1.506-.145 2.523-.851 1.65-1.147-3.195-1.08-5.834-3.078-7.07-5.35-.809-1.485-1.513-3.982-1.504-5.334l.006-.936.42.854c.232.47.941 1.333 1.576 1.918l1.155 1.064 2.189-.012 2.188-.011-1.012-.535c-.975-.514-3.353-2.766-3.353-3.175 0-.11.506.079 1.124.418 1.282.703 3.888 1.32 4.21.996.12-.118-.204-.612-.718-1.097-.513-.484-1.17-1.344-1.46-1.911l-.525-1.03 1.174.895c2.02 1.542 3.883 1.506 6.342-.123.69-.457 1.218-.863 1.175-.903s-.989.227-2.103.594c-1.87.618-2.11.64-3.151.305-1.284-.415-2.023-1.273-2.25-2.613l-.158-.926.486.595c1.07 1.31 2.652 1.255 6.363-.224 1.132-.451 2.892-1.036 3.91-1.3 2.732-.706 1.561-.926-2.298-.43-1.778.228-3.27.376-3.318.329-.047-.047.662-.415 1.575-.818 2.002-.883 4.78-1.152 6.858-.663 1.817.427 2.555.81 4.032 2.087 1.151.997 3.654 2.156 4.605 2.133.595-.015-2.96-3.395-4.552-4.328-1.639-.96-4.11-1.542-6.107-1.438-.92.049-1.627.016-1.571-.073.242-.388 3.44-.825 5.203-.71 4.048.265 6.96 2.546 10.902 8.537 2.553 3.883 4.234 5.67 6.137 6.524l1.092.49 2.215-1.027c4.747-2.2 8.797-2.518 16.097-1.26 2.25.387 4.717.704 5.482.704h1.39l.074 3.203.074 3.203.894-1.113c.88-1.096.894-1.152.846-3.516l-.049-2.402-1.61-1.721c-4.14-4.425-4.335-6.536-1.135-12.213 2.744-4.87 2.704-4.41.813-9.32-.883-2.292-1.696-4.167-1.807-4.167-.339 0-.205 4 .196 5.821.716 3.256.435 4.822-1.006 5.603-.371.2-2.144.33-4.904.36-3.6.036-4.348-.022-4.473-.348-.087-.227.102-.582.451-.845.53-.4.563-.53.274-1.09-.18-.35-.692-1.022-1.137-1.493s-.734-.933-.64-1.026c.093-.094 1.072-.036 2.175.128 3.023.45 3.76.398 4.211-.297.4-.615 2.887-9.725 2.704-9.907-.196-.196-1.55 1.62-2.759 3.7-1.782 3.068-3.14 3.895-6.379 3.889-2.485-.005-5.43-1.098-8.658-3.213-1.439-.943-3.02-1.855-3.514-2.027-1.524-.531-3.75-.392-5.163.324l-1.26.638.567-.603c.892-.95 3.048-2.004 4.432-2.167 1.94-.23 3.3.283 5.786 2.18 2.39 1.823 3.163 2.225 4.28 2.225.6 0 .497-.12-.745-.872-.792-.48-2.416-1.598-3.609-2.486-2.658-1.978-4.119-2.58-5.831-2.4l-1.26.132.926-.39c.667-.281 1.609-.36 3.373-.284 1.346.059 2.448.077 2.448.04 0-.278-2.537-1.455-3.71-1.722-.89-.202-1.231-.365-.884-.421.312-.051 1.86.225 3.44.614 2.564.63 3.167.687 5.602.525 5.536-.369 7.032-1.144 9.218-4.774l1.433-2.382-1.224 1.323c-.673.728-1.779 1.928-2.457 2.666-.677.739-1.53 1.417-1.893 1.508l-.662.165.61-.503c.334-.277 1.088-1.491 1.675-2.698 1.772-3.648 3.228-4.779 6.772-5.257 3.522-.476 4.797-.791 5.421-1.342.332-.293.429-.44.215-.329-.213.112-1.94.277-3.836.367-2.955.14-3.666.263-4.97.86-1.632.749-4.092 2.893-4.996 4.356-.764 1.236-.923.905-.224-.465 1.387-2.718 4.685-4.945 8.366-5.651l1.815-.349-1.058-.235c-.582-.13-1.952-.224-3.043-.209l-1.984.027 1.72-.82c1.427-.682 2.04-.822 3.611-.822 1.607 0 1.86-.06 1.679-.4-.539-1.005-1.377-1.452-2.69-1.432-.769.011-1.156-.067-.937-.19.534-.298 2.168-.34 4.169-.104 1.648.194 1.82.159 3.59-.733 1.023-.515 2.472-1.047 3.22-1.183 1.388-.253 3.607-.04 4.472.429.942.51 1.958 1.825 2.095 2.712.116.746 0 1.052-.671 1.777-.752.813-.811 1.018-.811 2.82 0 1.706-.105 2.127-.85 3.424-.467.814-.973 1.476-1.124 1.473s-.797-.242-1.435-.532c-1.277-.579-1.714-.435-1.988.655-.115.46.045.84.605 1.44.42.448 1.621 2.237 2.671 3.975 1.883 3.116 1.905 3.175 1.585 4.146-.258.78-.258 1.56 0 3.73.179 1.51.253 3.031.166 3.38-.128.509.033.795.805 1.432 1.367 1.126 5.02 2.947 5.914 2.947 1.268 0 1.588.247 1.588 1.227 0 1.057-.642 2.742-1.045 2.742-.153 0-.278-.298-.278-.662 0-.558-.123-.661-.793-.661-.436 0-2.162-.467-3.836-1.036l-3.044-1.036v1.788c0 .984-.077 3.057-.172 4.608l-.173 2.82h3.015l-.133.86c-.073.472-.206 2.11-.295 3.637-.373 6.42-.634 7.203-4.207 12.65-4.119 6.278-4.635 7.984-3.493 11.548.37 1.158.647 2.133.613 2.167-.246.246-2.569-1.19-3.783-2.34-2.616-2.473-2.922-3.975-1.146-5.619.954-.882 1.054-1.087.892-1.828-.417-1.91-.553-1.976-1-.482-.232.777-.693 1.849-1.024 2.382-.526.846-.603 1.318-.603 3.705v2.736l3.175 1.022c1.746.562 3.446 1.028 3.777 1.034.583.012.59-.012.194-.776-.224-.434-.479-1.307-.566-1.939-.208-1.523.53-3.065 3.905-8.159 4.537-6.845 5.478-9.25 5.681-14.513.07-1.82.19-3.93.267-4.692.137-1.353.17-1.398 1.379-1.933 2.27-1.004 4.245-3.717 6.253-8.589.526-1.274.459-1.204-1.891 1.985-1.019 1.382-2.13 2.751-2.47 3.042-.604.516-.603.506.048-.397.938-1.299 1.216-2.144 1.685-5.107.663-4.193 1.699-6.255 4.604-9.16 3.639-3.638 9.47-6.348 13.7-6.365.635-.003 1.201-.155 1.322-.356.117-.192 1.105-.92 2.196-1.615 1.092-.696 2.252-1.511 2.579-1.812.327-.3.66-.48.74-.4.081.081-.038.942-.263 1.914s-.41 1.88-.41 2.016c0 .37 1.393.3 1.992-.102.287-.192 1.296-.62 2.241-.953s1.998-.78 2.338-.994c.34-.215.665-.345.722-.288.302.302-1.982 3.526-2.927 4.132l-1.152.74c-.277.179 1.202 3.732 1.975 4.745.674.882.862 1.347.742 1.825-.089.354.045 1.273.296 2.044.645 1.98 2.913 6.751 3.698 7.779.808 1.06.82 1.416.075 2.363-.32.408-.648 1.225-.728 1.816-.118.879-.279 1.12-.89 1.335-1.457.512-2.298-.449-2.94-3.358-.113-.512-.325-.728-.715-.728-.634 0-.619.099.398 2.514.368.873.572 1.685.453 1.804-.12.119-.679.178-1.244.132-1.006-.082-1.03-.108-1.165-1.29-.11-.958-.407-1.515-1.444-2.716-1.28-1.483-1.523-1.617-3.974-2.186-.436-.102-1.235-.406-1.776-.677l-.981-.491-.311 1.124c-.462 1.668-.381 7.592.14 10.35.244 1.29.926 3.552 1.516 5.027 1.864 4.655 1.933 4.98 1.924 9.031-.006 2.853-.112 3.972-.461 4.87-.25.641-.415 1.204-.367 1.252.047.047 2.935.203 6.419.347 4.2.174 6.786.397 7.679.664 1.433.429 2.955 1.341 3.328 1.995.125.219 1.292 3.718 2.594 7.777 2.56 7.978 2.515 7.613 1.142 9.263-.582.7-.623.918-.458 2.455l.18 1.686-1.685 1.59c-2.476 2.335-2.487 2.338-2.833.702l-.825-3.894c-.497-2.344-.503-2.535-.09-2.844.245-.182.75-.332 1.121-.335 1.259-.007 1.444-.36.672-1.277l-.7-.833.461-1.209c.403-1.054.421-1.428.146-2.924-.856-4.647-3.463-7.755-6.516-7.769-1.198-.006-5.626.726-6.143 1.015-.419.235 1.36 2.035 4.026 4.073 1.954 1.494 2.487 2.265 2.708 3.918.115.858-.031 1.278-.963 2.753-1.122 1.776-2.596 4.941-4.015 8.62-.437 1.133-1.048 2.383-1.358 2.777-.546.695-.623.712-2.434.544-1.51-.14-2.034-.085-2.726.287-.933.503-1.032.488-5.234-.754l-1.852-.547 1.058-.93c2.452-2.155 4.96-4.035 5.375-4.028.245.004.743.417 1.107.919.364.5.74.914.835.918.336.014 2.673-2.777 3.423-4.09.928-1.622 1.429-3.721 1.19-4.992-.414-2.208-2.105-3.2-8.836-5.183-4.604-1.356-5.44-1.637-6.837-2.3-.81-.384-.92-.36-3.047.664-2.593 1.248-5.507 2.251-8.665 2.983-3.304.766-9.686.95-12.988.376-3.227-.562-7.639-2.035-9.626-3.214-.856-.508-1.618-.862-1.693-.787-.15.15 1.12 2.079 1.665 2.53.271.226.239.732-.166 2.586-1.245 5.713-2.66 8.612-7.189 14.73-2.852 3.852-3.402 5.685-2.327 7.762.66 1.274 9.278 9.763 11.016 10.85.797.498 1.576 1.26 1.929 1.889.496.883 2.158 5.275 2.158 5.704 0 .2-1.577.111-2.779-.154\" style=\"fill:teal;stroke-width:.264583\"></path></svg>\n`)}`\n\n// ---------- Built-in Skins Registry ---------- //\n\n/**\n * Built-in skins that ship with the WalletConnect adapter.\n * PRs to add new WalletConnect-compatible wallets should add entries here.\n */\nexport const BUILTIN_SKINS: Record<string, WalletConnectSkin> = {\n biatec: {\n id: 'biatec',\n name: 'Biatec Wallet',\n icon: BIATEC_ICON\n },\n voiwallet: {\n id: 'voiwallet',\n name: 'Voi Wallet',\n icon: VOI_WALLET_ICON\n }\n}\n\n// ---------- Custom Skins Registry (Runtime) ---------- //\n\n/**\n * Runtime registry for custom skins added by developers.\n * Use `registerSkin()` to add custom skins.\n */\nconst customSkins = new Map<string, WalletConnectSkin>()\n\n/**\n * Register a custom WalletConnect skin at runtime.\n * This allows developers to add their own wallet skins without PRing the library.\n *\n * @param skin - The skin definition to register\n * @throws Error if attempting to override a built-in skin\n *\n * @example\n * ```typescript\n * import { registerSkin } from '@txnlab/use-wallet-walletconnect'\n *\n * registerSkin({\n * id: 'mywallet',\n * name: 'My Custom Wallet',\n * icon: 'data:image/svg+xml;base64,...'\n * })\n * ```\n */\nexport function registerSkin(skin: WalletConnectSkin): void {\n if (BUILTIN_SKINS[skin.id]) {\n throw new Error(`Cannot override built-in skin: ${skin.id}`)\n }\n customSkins.set(skin.id, skin)\n}\n\n/**\n * Get a skin by its ID from either built-in or custom registries.\n *\n * @param skinId - The skin identifier\n * @returns The skin definition, or undefined if not found\n */\nexport function getSkin(skinId: string): WalletConnectSkin | undefined {\n return BUILTIN_SKINS[skinId] || customSkins.get(skinId)\n}\n\n/**\n * Resolve a skin option to a full WalletConnectSkin object.\n *\n * If the option is a string, looks up the skin in the registries.\n * If the option is a full skin object, registers it as a custom skin and returns it.\n *\n * @param skinOption - Either a skin ID string or a full skin definition\n * @returns The resolved skin, or undefined if not found (when string ID provided)\n */\nexport function resolveSkin(skinOption: WalletConnectSkinOption): WalletConnectSkin | undefined {\n if (typeof skinOption === 'string') {\n return getSkin(skinOption)\n }\n\n // If it's a full skin definition, register it as a custom skin\n if (!BUILTIN_SKINS[skinOption.id]) {\n customSkins.set(skinOption.id, skinOption)\n }\n return skinOption\n}\n","import { WalletConnectAdapter } from './adapter'\nimport { resolveSkin } from './skins'\nimport type { WalletConnectOptions } from './adapter'\nimport type { WalletAdapterConfig } from '@txnlab/use-wallet'\n\nexport const WALLET_ID = 'walletconnect' as const\n\nexport function walletConnect(options: WalletConnectOptions): WalletAdapterConfig {\n const skin = options.skin ? resolveSkin(options.skin) : null\n const id = skin ? `walletconnect:${skin.id}` : WALLET_ID\n const metadata = skin\n ? { name: skin.name, icon: skin.icon }\n : WalletConnectAdapter.defaultMetadata\n\n return {\n id,\n metadata,\n Adapter: WalletConnectAdapter as unknown as WalletAdapterConfig['Adapter'],\n options: options as unknown as Record<string, unknown> | undefined\n }\n}\n\nexport { WalletConnectAdapter }\nexport { SessionError } from './adapter'\nexport type { WalletConnectOptions, SignTxnsResponse } from './adapter'\n\n// Skins utilities and types\nexport { registerSkin, getSkin, resolveSkin, BUILTIN_SKINS } from './skins'\nexport type { WalletConnectSkin, WalletConnectSkinOption } from './skins'\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@txnlab/use-wallet-walletconnect",
|
|
3
|
+
"version": "5.0.0-rc.1",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public",
|
|
6
|
+
"provenance": true
|
|
7
|
+
},
|
|
8
|
+
"description": "WalletConnect adapter for @txnlab/use-wallet",
|
|
9
|
+
"author": "Doug Richar <drichar@gmail.com>",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/txnlab/use-wallet.git",
|
|
14
|
+
"directory": "packages/wallets/walletconnect"
|
|
15
|
+
},
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@txnlab/use-wallet": "^5.0.0",
|
|
30
|
+
"algosdk": "^3.0.0"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@walletconnect/modal": "2.7.0",
|
|
34
|
+
"@walletconnect/sign-client": "2.23.4",
|
|
35
|
+
"@walletconnect/types": "2.23.4"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@txnlab/use-wallet": "5.0.0-rc.1",
|
|
39
|
+
"algosdk": "3.5.2",
|
|
40
|
+
"tsdown": "0.21.0",
|
|
41
|
+
"typescript": "5.9.3"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsdown",
|
|
45
|
+
"start": "tsdown --watch",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:watch": "vitest --watch",
|
|
48
|
+
"lint": "eslint \"src/**/*.{js,ts}\"",
|
|
49
|
+
"typecheck": "tsc --noEmit"
|
|
50
|
+
}
|
|
51
|
+
}
|