@ckb-ccc/connector 0.0.9-alpha.2 → 0.0.10-alpha.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/dist/assets/chains/index.d.ts +1 -0
- package/dist/assets/chains/index.d.ts.map +1 -1
- package/dist/assets/chains/index.js +1 -0
- package/dist/barrel.d.ts +2 -1
- package/dist/barrel.d.ts.map +1 -1
- package/dist/barrel.js +2 -1
- package/dist/components/button-pill.d.ts +7 -0
- package/dist/components/button-pill.d.ts.map +1 -0
- package/dist/components/button-pill.js +54 -0
- package/dist/components/button.d.ts +7 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +60 -0
- package/dist/components/copy-button.d.ts +10 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +76 -0
- package/dist/components/dialog.d.ts +8 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +103 -0
- package/dist/components/index.d.ts +5 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +4 -0
- package/dist/connector/index.d.ts +8 -21
- package/dist/connector/index.d.ts.map +1 -1
- package/dist/connector/index.js +59 -496
- package/dist/scenes/connected.d.ts +12 -1
- package/dist/scenes/connected.d.ts.map +1 -1
- package/dist/scenes/connected.js +204 -59
- package/dist/scenes/index.d.ts +2 -3
- package/dist/scenes/index.d.ts.map +1 -1
- package/dist/scenes/index.js +2 -3
- package/dist/scenes/{connecting.d.ts → selecting/connecting.d.ts} +1 -1
- package/dist/scenes/selecting/connecting.d.ts.map +1 -0
- package/dist/scenes/{connecting.js → selecting/connecting.js} +5 -5
- package/dist/scenes/selecting/index.d.ts +19 -0
- package/dist/scenes/selecting/index.d.ts.map +1 -0
- package/dist/scenes/selecting/index.js +164 -0
- package/dist/scenes/{signers.d.ts → selecting/signers.d.ts} +1 -1
- package/dist/scenes/selecting/signers.d.ts.map +1 -0
- package/dist/scenes/{signers.js → selecting/signers.js} +6 -7
- package/dist/scenes/{wallets.d.ts → selecting/wallets.d.ts} +1 -1
- package/dist/scenes/selecting/wallets.d.ts.map +1 -0
- package/dist/scenes/{wallets.js → selecting/wallets.js} +3 -3
- package/dist/signers/index.d.ts +28 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +104 -0
- package/package.json +3 -3
- package/src/assets/chains/index.ts +1 -0
- package/src/barrel.ts +3 -1
- package/src/components/button-pill.ts +48 -0
- package/src/components/button.ts +54 -0
- package/src/components/copy-button.ts +69 -0
- package/src/components/dialog.ts +97 -0
- package/src/components/index.ts +4 -0
- package/src/connector/index.ts +67 -596
- package/src/scenes/connected.ts +197 -68
- package/src/scenes/index.ts +2 -3
- package/src/scenes/{connecting.ts → selecting/connecting.ts} +6 -6
- package/src/scenes/selecting/index.ts +181 -0
- package/src/scenes/{signers.ts → selecting/signers.ts} +7 -8
- package/src/scenes/{wallets.ts → selecting/wallets.ts} +4 -4
- package/src/signers/index.ts +186 -0
- package/dist/assets/chains/ckb.sm.svg.d.ts +0 -2
- package/dist/assets/chains/ckb.sm.svg.d.ts.map +0 -1
- package/dist/assets/chains/ckb.sm.svg.js +0 -2
- package/dist/assets/copy.svg.d.ts +0 -2
- package/dist/assets/copy.svg.d.ts.map +0 -1
- package/dist/assets/copy.svg.js +0 -2
- package/dist/events/index.d.ts +0 -7
- package/dist/events/index.d.ts.map +0 -1
- package/dist/events/index.js +0 -10
- package/dist/scenes/connecting.d.ts.map +0 -1
- package/dist/scenes/signers.d.ts.map +0 -1
- package/dist/scenes/wallets.d.ts.map +0 -1
- package/src/assets/chains/ckb.sm.svg.ts +0 -5
- package/src/assets/copy.svg.ts +0 -5
- package/src/events/index.ts +0 -11
package/src/connector/index.ts
CHANGED
|
@@ -2,63 +2,30 @@ import { ccc } from "@ckb-ccc/ccc";
|
|
|
2
2
|
import { LitElement, PropertyValues, css, html } from "lit";
|
|
3
3
|
import { customElement, property, state } from "lit/decorators.js";
|
|
4
4
|
import { Ref, createRef, ref } from "lit/directives/ref.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { JOY_ID_SVG } from "../assets/joy-id.svg";
|
|
8
|
-
import { LEFT_SVG } from "../assets/left.svg";
|
|
9
|
-
import { METAMASK_SVG } from "../assets/metamask.svg";
|
|
10
|
-
import { OKX_SVG } from "../assets/okx.svg";
|
|
11
|
-
import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
|
|
12
|
-
import { ClosedEvent, WillUpdateEvent } from "../events";
|
|
13
|
-
import {
|
|
14
|
-
generateConnectingScene,
|
|
15
|
-
generateSignersScene,
|
|
16
|
-
generateWalletsScene,
|
|
17
|
-
} from "../scenes";
|
|
18
|
-
import { generateConnectedScene } from "../scenes/connected";
|
|
19
|
-
import { WalletWithSigners } from "../types";
|
|
20
|
-
|
|
21
|
-
enum Scene {
|
|
22
|
-
SelectingWallets = "SelectingWallets",
|
|
23
|
-
SelectingSigners = "SelectingSigners",
|
|
24
|
-
Connecting = "Connecting",
|
|
25
|
-
Connected = "Connected",
|
|
26
|
-
}
|
|
5
|
+
import { ConnectedEvent } from "../scenes/selecting";
|
|
6
|
+
import { SignersController } from "../signers";
|
|
27
7
|
|
|
28
8
|
@customElement("ccc-connector")
|
|
29
9
|
export class WebComponentConnector extends LitElement {
|
|
30
|
-
@
|
|
31
|
-
|
|
10
|
+
@property()
|
|
11
|
+
public name?: string;
|
|
12
|
+
@property()
|
|
13
|
+
public icon?: string;
|
|
14
|
+
@property()
|
|
15
|
+
public preferredNetworks?: ccc.NetworkPreference[];
|
|
32
16
|
@property()
|
|
33
17
|
public signerFilter?: (
|
|
34
18
|
signerInfo: ccc.SignerInfo,
|
|
35
19
|
wallet: ccc.Wallet,
|
|
36
20
|
) => Promise<boolean>;
|
|
37
21
|
|
|
38
|
-
private resetListeners: (() => void)[] = [];
|
|
39
|
-
|
|
40
|
-
@property()
|
|
41
|
-
public preferredNetworks?: ccc.NetworkPreference[];
|
|
42
|
-
|
|
43
|
-
@property()
|
|
44
|
-
public name?: string;
|
|
45
|
-
@property()
|
|
46
|
-
public icon?: string;
|
|
47
|
-
|
|
48
22
|
@state()
|
|
49
23
|
public client: ccc.Client = new ccc.ClientPublicTestnet();
|
|
50
24
|
public setClient(client: ccc.Client) {
|
|
51
25
|
this.client = client;
|
|
52
26
|
}
|
|
53
27
|
|
|
54
|
-
|
|
55
|
-
private scene: Scene = Scene.SelectingWallets;
|
|
56
|
-
@state()
|
|
57
|
-
private selectedWallet?: WalletWithSigners;
|
|
58
|
-
@state()
|
|
59
|
-
private selectedSigner?: ccc.SignerInfo;
|
|
60
|
-
@state()
|
|
61
|
-
private connectingError?: string;
|
|
28
|
+
private signersController = new SignersController(this);
|
|
62
29
|
|
|
63
30
|
@state()
|
|
64
31
|
private walletName?: string;
|
|
@@ -68,41 +35,14 @@ export class WebComponentConnector extends LitElement {
|
|
|
68
35
|
public wallet?: ccc.Wallet;
|
|
69
36
|
@state()
|
|
70
37
|
public signer?: ccc.SignerInfo;
|
|
71
|
-
|
|
72
38
|
@state()
|
|
73
|
-
private
|
|
74
|
-
@state()
|
|
75
|
-
private internalAddress?: string;
|
|
76
|
-
@state()
|
|
77
|
-
private balance?: ccc.Num;
|
|
78
|
-
|
|
79
|
-
private async updateSignerInfo() {
|
|
80
|
-
const signer = this.signer?.signer;
|
|
81
|
-
if (!signer) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
this.recommendAddress = await signer.getRecommendedAddress();
|
|
85
|
-
this.internalAddress = await signer.getInternalAddress();
|
|
86
|
-
this.balance = await signer.getBalance();
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private async prepareSigner() {
|
|
90
|
-
if (this.signer && (await this.signer.signer.isConnected())) {
|
|
91
|
-
await this.updateSignerInfo();
|
|
92
|
-
this.scene = Scene.Connected;
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
this.wallet = undefined;
|
|
97
|
-
this.signer = undefined;
|
|
98
|
-
this.scene = Scene.SelectingWallets;
|
|
99
|
-
}
|
|
39
|
+
private unregisterSignerReplacer?: () => void;
|
|
100
40
|
|
|
101
41
|
public disconnect() {
|
|
102
42
|
this.walletName = undefined;
|
|
103
43
|
this.signerName = undefined;
|
|
104
44
|
this.saveConnection();
|
|
105
|
-
this.
|
|
45
|
+
this.dispatchEvent(new Event("close", { bubbles: true, composed: true }));
|
|
106
46
|
this.signer?.signer.disconnect();
|
|
107
47
|
}
|
|
108
48
|
|
|
@@ -131,291 +71,99 @@ export class WebComponentConnector extends LitElement {
|
|
|
131
71
|
connectedCallback(): void {
|
|
132
72
|
super.connectedCallback();
|
|
133
73
|
this.loadConnection();
|
|
134
|
-
this.reloadSigners();
|
|
135
|
-
// Delay for extensions to load
|
|
136
|
-
setTimeout(() => this.reloadSigners(), 100);
|
|
137
74
|
}
|
|
138
75
|
|
|
139
76
|
willUpdate(changedProperties: PropertyValues): void {
|
|
140
77
|
if (
|
|
78
|
+
changedProperties.has("name") ||
|
|
79
|
+
changedProperties.has("icon") ||
|
|
141
80
|
changedProperties.has("client") ||
|
|
142
81
|
changedProperties.has("signerFilter") ||
|
|
143
82
|
changedProperties.has("preferredNetworks")
|
|
144
83
|
) {
|
|
145
|
-
this.
|
|
84
|
+
this.signersController.refresh();
|
|
146
85
|
}
|
|
147
86
|
if (
|
|
148
|
-
(changedProperties.has("scene") && this.scene === Scene.Connected) ||
|
|
149
|
-
changedProperties.has("wallets") ||
|
|
150
87
|
changedProperties.has("walletName") ||
|
|
151
88
|
changedProperties.has("signerName")
|
|
152
89
|
) {
|
|
153
|
-
(
|
|
154
|
-
const wallet = this.wallets.find(
|
|
155
|
-
({ name }) => name === this.walletName,
|
|
156
|
-
);
|
|
157
|
-
const signer = wallet?.signers.find(
|
|
158
|
-
({ name }) => name === this.signerName,
|
|
159
|
-
);
|
|
160
|
-
if (signer && (await signer.signer.isConnected())) {
|
|
161
|
-
this.wallet = wallet;
|
|
162
|
-
this.signer = signer;
|
|
163
|
-
} else {
|
|
164
|
-
this.wallet = undefined;
|
|
165
|
-
this.signer = undefined;
|
|
166
|
-
}
|
|
167
|
-
})();
|
|
168
|
-
}
|
|
169
|
-
if (changedProperties.has("signer")) {
|
|
170
|
-
this.prepareSigner();
|
|
90
|
+
this.refreshSigner();
|
|
171
91
|
}
|
|
172
92
|
|
|
173
|
-
this.dispatchEvent(new
|
|
93
|
+
this.dispatchEvent(new Event("willUpdate"));
|
|
174
94
|
}
|
|
175
95
|
|
|
176
|
-
|
|
177
|
-
this.wallets
|
|
178
|
-
|
|
179
|
-
(async () => {
|
|
180
|
-
const signer = this.signer;
|
|
181
|
-
if (!signer) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
if (await signer.signer.replaceClient(this.client)) {
|
|
186
|
-
this.signer = {
|
|
187
|
-
...signer,
|
|
188
|
-
};
|
|
189
|
-
} else {
|
|
190
|
-
this.signer = undefined;
|
|
191
|
-
}
|
|
192
|
-
})();
|
|
193
|
-
|
|
194
|
-
this.resetListeners.forEach((listener) => listener());
|
|
195
|
-
this.resetListeners = [];
|
|
196
|
-
const name =
|
|
197
|
-
this.name ??
|
|
198
|
-
(document.querySelector("head title") as HTMLTitleElement).text;
|
|
199
|
-
const icon =
|
|
200
|
-
this.icon ??
|
|
201
|
-
(document.querySelector('link[rel="icon"]') as HTMLLinkElement).href;
|
|
202
|
-
const preferredNetworks = [
|
|
203
|
-
...(this.preferredNetworks ?? []),
|
|
204
|
-
{
|
|
205
|
-
addressPrefix: "ckb",
|
|
206
|
-
signerType: ccc.SignerType.BTC,
|
|
207
|
-
network: "btc",
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
addressPrefix: "ckt",
|
|
211
|
-
signerType: ccc.SignerType.BTC,
|
|
212
|
-
network: "btcTestnet",
|
|
213
|
-
},
|
|
214
|
-
];
|
|
215
|
-
|
|
216
|
-
ccc.JoyId.getJoyIdSigners(
|
|
217
|
-
this.client,
|
|
218
|
-
name,
|
|
219
|
-
icon,
|
|
220
|
-
preferredNetworks,
|
|
221
|
-
).forEach(({ signer, name }) => {
|
|
222
|
-
this.addSigner("JoyID", name, JOY_ID_SVG, signer);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
const uniSatSigner = ccc.UniSat.getUniSatSigner(
|
|
226
|
-
this.client,
|
|
227
|
-
preferredNetworks,
|
|
228
|
-
);
|
|
229
|
-
if (uniSatSigner) {
|
|
230
|
-
this.addSigner("UniSat", "BTC", UNI_SAT_SVG, uniSatSigner);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
ccc.Okx.getOKXBitcoinSigner(this.client, preferredNetworks).forEach(
|
|
234
|
-
(signer) => {
|
|
235
|
-
this.addSigner("OKX Wallet", signer.type, OKX_SVG, signer);
|
|
236
|
-
},
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
const nip07Signer = ccc.Nip07.getNip07Signer(this.client);
|
|
240
|
-
if (nip07Signer) {
|
|
241
|
-
this.addSigner("Nostr", "Nostr", NOSTR_SVG, nip07Signer);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
|
|
245
|
-
this.resetListeners.push(
|
|
246
|
-
eip6963Manager.subscribeSigners((signer) => {
|
|
247
|
-
this.addSigner(
|
|
248
|
-
`${signer.detail.info.name}`,
|
|
249
|
-
"EVM",
|
|
250
|
-
signer.detail.info.icon,
|
|
251
|
-
signer,
|
|
252
|
-
);
|
|
253
|
-
}),
|
|
96
|
+
async refreshSigner() {
|
|
97
|
+
const wallet = this.signersController.wallets.find(
|
|
98
|
+
({ name }) => name === this.walletName,
|
|
254
99
|
);
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
this.addSigner(
|
|
258
|
-
"MetaMask",
|
|
259
|
-
"EVM",
|
|
260
|
-
METAMASK_SVG,
|
|
261
|
-
new ccc.SignerOpenLink(
|
|
262
|
-
this.client,
|
|
263
|
-
ccc.SignerType.EVM,
|
|
264
|
-
`https://metamask.app.link/dapp/${window.location.href}`,
|
|
265
|
-
),
|
|
266
|
-
);
|
|
267
|
-
[ccc.SignerType.EVM, ccc.SignerType.BTC].forEach((type) => {
|
|
268
|
-
this.addSigner(
|
|
269
|
-
"OKX Wallet",
|
|
270
|
-
type,
|
|
271
|
-
OKX_SVG,
|
|
272
|
-
new ccc.SignerOpenLink(
|
|
273
|
-
this.client,
|
|
274
|
-
type,
|
|
275
|
-
"https://www.okx.com/download?deeplink=" +
|
|
276
|
-
encodeURIComponent(
|
|
277
|
-
"okx://wallet/dapp/url?dappUrl=" +
|
|
278
|
-
encodeURIComponent(window.location.href),
|
|
279
|
-
),
|
|
280
|
-
),
|
|
281
|
-
);
|
|
282
|
-
});
|
|
283
|
-
this.addSigner(
|
|
284
|
-
"UniSat",
|
|
285
|
-
ccc.SignerType.BTC,
|
|
286
|
-
UNI_SAT_SVG,
|
|
287
|
-
new ccc.SignerOpenLink(
|
|
288
|
-
this.client,
|
|
289
|
-
ccc.SignerType.BTC,
|
|
290
|
-
"https://unisat.io/download",
|
|
291
|
-
),
|
|
292
|
-
);
|
|
293
|
-
// ===
|
|
100
|
+
const signer = wallet?.signers.find(({ name }) => name === this.signerName);
|
|
101
|
+
this.updateSigner(wallet, signer);
|
|
294
102
|
}
|
|
295
103
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
icon: string,
|
|
300
|
-
signer: ccc.Signer,
|
|
104
|
+
async updateSigner(
|
|
105
|
+
wallet: ccc.Wallet | undefined,
|
|
106
|
+
signerInfo: ccc.SignerInfo | undefined,
|
|
301
107
|
) {
|
|
302
|
-
|
|
303
|
-
if (
|
|
304
|
-
this.signerFilter &&
|
|
305
|
-
!(await this.signerFilter(signerInfo, { name: walletName, icon }))
|
|
306
|
-
) {
|
|
108
|
+
if (signerInfo?.signer === this.signer?.signer) {
|
|
307
109
|
return;
|
|
308
110
|
}
|
|
309
|
-
let updated = false;
|
|
310
|
-
const wallets = this.wallets.map((wallet) => {
|
|
311
|
-
if (wallet.name !== walletName) {
|
|
312
|
-
return wallet;
|
|
313
|
-
}
|
|
314
111
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
const signers = allSigners.filter(
|
|
318
|
-
({ signer }) => !(signer instanceof ccc.SignerDummy),
|
|
319
|
-
);
|
|
320
|
-
return {
|
|
321
|
-
...wallet,
|
|
322
|
-
signers: signers.length !== 0 ? signers : [signerInfo],
|
|
323
|
-
};
|
|
324
|
-
});
|
|
112
|
+
this.unregisterSignerReplacer?.();
|
|
113
|
+
this.unregisterSignerReplacer = undefined;
|
|
325
114
|
|
|
326
|
-
if (
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
115
|
+
if (signerInfo && (await signerInfo.signer.isConnected())) {
|
|
116
|
+
this.wallet = wallet;
|
|
117
|
+
this.signer = signerInfo;
|
|
118
|
+
(this.unregisterSignerReplacer as unknown as () => void)?.();
|
|
119
|
+
this.unregisterSignerReplacer = signerInfo.signer.onReplaced(() => {
|
|
120
|
+
this.signersController.refresh();
|
|
331
121
|
});
|
|
122
|
+
} else {
|
|
123
|
+
this.wallet = undefined;
|
|
124
|
+
this.signer = undefined;
|
|
332
125
|
}
|
|
333
|
-
|
|
334
|
-
this.wallets = wallets;
|
|
335
126
|
}
|
|
336
127
|
|
|
337
|
-
mainRef: Ref<HTMLDivElement> = createRef();
|
|
338
|
-
|
|
339
|
-
|
|
128
|
+
private readonly mainRef: Ref<HTMLDivElement> = createRef();
|
|
129
|
+
private readonly bodyRef: Ref<HTMLDivElement & { onClose?: () => void }> =
|
|
130
|
+
createRef();
|
|
340
131
|
|
|
341
132
|
render() {
|
|
342
|
-
|
|
343
|
-
if (this.scene === Scene.Connected && this.wallet && this.signer) {
|
|
344
|
-
return generateConnectedScene(
|
|
345
|
-
this.wallet,
|
|
346
|
-
this.signer,
|
|
347
|
-
this.recommendAddress,
|
|
348
|
-
this.internalAddress,
|
|
349
|
-
this.balance,
|
|
350
|
-
this.disconnect.bind(this),
|
|
351
|
-
);
|
|
352
|
-
}
|
|
353
|
-
if (this.scene === Scene.SelectingWallets || !this.selectedWallet) {
|
|
354
|
-
return generateWalletsScene(
|
|
355
|
-
this.wallets,
|
|
356
|
-
(wallet) => {
|
|
357
|
-
this.selectedWallet = wallet;
|
|
358
|
-
this.scene = Scene.SelectingSigners;
|
|
359
|
-
},
|
|
360
|
-
this.signerSelectedHandler,
|
|
361
|
-
);
|
|
362
|
-
}
|
|
363
|
-
if (this.scene === Scene.SelectingSigners || !this.selectedSigner) {
|
|
364
|
-
return generateSignersScene(
|
|
365
|
-
this.selectedWallet,
|
|
366
|
-
this.signerSelectedHandler,
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
return generateConnectingScene(
|
|
370
|
-
this.selectedWallet,
|
|
371
|
-
this.selectedSigner,
|
|
372
|
-
this.connectingError,
|
|
373
|
-
this.signerSelectedHandler,
|
|
374
|
-
);
|
|
375
|
-
})();
|
|
376
|
-
|
|
377
|
-
const canBack = [Scene.SelectingSigners, Scene.Connecting].includes(
|
|
378
|
-
this.scene,
|
|
379
|
-
);
|
|
380
|
-
|
|
381
|
-
return html` <div
|
|
133
|
+
return html`<div
|
|
382
134
|
class="background"
|
|
383
135
|
@click=${(event: Event) => {
|
|
384
136
|
if (event.target === event.currentTarget) {
|
|
385
|
-
this.
|
|
137
|
+
this.dispatchEvent(
|
|
138
|
+
new Event("close", { bubbles: true, composed: true }),
|
|
139
|
+
);
|
|
140
|
+
this.bodyRef.value?.onClose?.();
|
|
386
141
|
}
|
|
387
142
|
}}
|
|
143
|
+
@updated=${() => this.updated()}
|
|
388
144
|
>
|
|
389
145
|
<div class="main" ${ref(this.mainRef)}>
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
this.
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
${title}
|
|
412
|
-
<img
|
|
413
|
-
class="close active"
|
|
414
|
-
src=${CLOSE_SVG}
|
|
415
|
-
@click=${this.closedHandler}
|
|
416
|
-
/>
|
|
417
|
-
</div>
|
|
418
|
-
<div class="body" ${ref(this.bodyRef)}>${body}</div>
|
|
146
|
+
${this.wallet && this.signer
|
|
147
|
+
? html`
|
|
148
|
+
<ccc-connected-scene
|
|
149
|
+
.wallet=${this.wallet}
|
|
150
|
+
.signer=${this.signer.signer}
|
|
151
|
+
@disconnect=${() => this.disconnect()}
|
|
152
|
+
${ref(this.bodyRef)}
|
|
153
|
+
></ccc-connected-scene>
|
|
154
|
+
`
|
|
155
|
+
: html`
|
|
156
|
+
<ccc-selecting-scene
|
|
157
|
+
.wallets=${this.signersController.wallets}
|
|
158
|
+
@connected=${({ walletName, signerName }: ConnectedEvent) => {
|
|
159
|
+
this.walletName = walletName;
|
|
160
|
+
this.signerName = signerName;
|
|
161
|
+
this.refreshSigner();
|
|
162
|
+
this.saveConnection();
|
|
163
|
+
}}
|
|
164
|
+
${ref(this.bodyRef)}
|
|
165
|
+
></ccc-selecting-scene>
|
|
166
|
+
`}
|
|
419
167
|
</div>
|
|
420
168
|
</div>`;
|
|
421
169
|
}
|
|
@@ -425,66 +173,10 @@ export class WebComponentConnector extends LitElement {
|
|
|
425
173
|
return;
|
|
426
174
|
}
|
|
427
175
|
this.mainRef.value.style.height = `${
|
|
428
|
-
|
|
429
|
-
(this.headerRef.value?.clientHeight ?? 0)
|
|
176
|
+
this.bodyRef.value?.clientHeight ?? 0
|
|
430
177
|
}px`;
|
|
431
178
|
}
|
|
432
179
|
|
|
433
|
-
private closedHandler = () => {
|
|
434
|
-
if (
|
|
435
|
-
[
|
|
436
|
-
Scene.SelectingSigners,
|
|
437
|
-
Scene.SelectingWallets,
|
|
438
|
-
Scene.Connecting,
|
|
439
|
-
].includes(this.scene)
|
|
440
|
-
) {
|
|
441
|
-
this.scene = Scene.SelectingWallets;
|
|
442
|
-
this.selectedSigner = undefined;
|
|
443
|
-
this.selectedWallet = undefined;
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
this.dispatchEvent(new ClosedEvent());
|
|
447
|
-
};
|
|
448
|
-
|
|
449
|
-
private signerSelectedHandler = (
|
|
450
|
-
wallet: WalletWithSigners,
|
|
451
|
-
signerInfo: ccc.SignerInfo,
|
|
452
|
-
) => {
|
|
453
|
-
this.scene = Scene.Connecting;
|
|
454
|
-
this.connectingError = undefined;
|
|
455
|
-
this.selectedWallet = wallet;
|
|
456
|
-
this.selectedSigner = signerInfo;
|
|
457
|
-
(async () => {
|
|
458
|
-
const { signer } = signerInfo;
|
|
459
|
-
try {
|
|
460
|
-
await signer.connect();
|
|
461
|
-
} catch (error) {
|
|
462
|
-
if (typeof error === "object") {
|
|
463
|
-
const message = (error as { message: unknown })?.message;
|
|
464
|
-
if (typeof message === "string") {
|
|
465
|
-
this.connectingError = message;
|
|
466
|
-
} else {
|
|
467
|
-
this.connectingError = JSON.stringify(message);
|
|
468
|
-
}
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
this.connectingError = JSON.stringify(error);
|
|
473
|
-
}
|
|
474
|
-
if (!(await signer.isConnected())) {
|
|
475
|
-
return;
|
|
476
|
-
}
|
|
477
|
-
this.scene = Scene.Connected;
|
|
478
|
-
this.walletName = wallet.name;
|
|
479
|
-
this.signerName = signerInfo.name;
|
|
480
|
-
this.saveConnection();
|
|
481
|
-
this.closedHandler();
|
|
482
|
-
this.internalAddress = await signer.getInternalAddress();
|
|
483
|
-
this.recommendAddress = await signer.getRecommendedAddress();
|
|
484
|
-
this.balance = await signer.getBalance();
|
|
485
|
-
})();
|
|
486
|
-
};
|
|
487
|
-
|
|
488
180
|
static styles = css`
|
|
489
181
|
:host {
|
|
490
182
|
width: 100vw;
|
|
@@ -494,62 +186,6 @@ export class WebComponentConnector extends LitElement {
|
|
|
494
186
|
top: 0;
|
|
495
187
|
}
|
|
496
188
|
|
|
497
|
-
button {
|
|
498
|
-
background: none;
|
|
499
|
-
color: inherit;
|
|
500
|
-
border: none;
|
|
501
|
-
padding: 0;
|
|
502
|
-
font: inherit;
|
|
503
|
-
cursor: pointer;
|
|
504
|
-
outline: inherit;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
.text-bold {
|
|
508
|
-
font-weight: bold;
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
.text-tip {
|
|
512
|
-
color: var(--tip-color);
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
.fs-sm {
|
|
516
|
-
font-size: 0.8rem;
|
|
517
|
-
}
|
|
518
|
-
.fs-md {
|
|
519
|
-
font-size: 1rem;
|
|
520
|
-
}
|
|
521
|
-
.fs-lg {
|
|
522
|
-
font-size: 1.2rem;
|
|
523
|
-
}
|
|
524
|
-
.fs-xl {
|
|
525
|
-
font-size: 1.5rem;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
.mb-1 {
|
|
529
|
-
margin-bottom: 0.7rem;
|
|
530
|
-
}
|
|
531
|
-
.mb-2 {
|
|
532
|
-
margin-bottom: 1rem;
|
|
533
|
-
}
|
|
534
|
-
.mt-1 {
|
|
535
|
-
margin-top: 0.7rem;
|
|
536
|
-
}
|
|
537
|
-
.mt-2 {
|
|
538
|
-
margin-top: 1rem;
|
|
539
|
-
}
|
|
540
|
-
.ml-1 {
|
|
541
|
-
margin-left: 0.7rem;
|
|
542
|
-
}
|
|
543
|
-
.ml-2 {
|
|
544
|
-
margin-left: 1em;
|
|
545
|
-
}
|
|
546
|
-
.mr-1 {
|
|
547
|
-
margin-right: 0.7rem;
|
|
548
|
-
}
|
|
549
|
-
.mr-2 {
|
|
550
|
-
margin-right: 1rem;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
189
|
.background {
|
|
554
190
|
width: 100%;
|
|
555
191
|
height: 100%;
|
|
@@ -566,170 +202,5 @@ export class WebComponentConnector extends LitElement {
|
|
|
566
202
|
overflow: hidden;
|
|
567
203
|
transition: height 0.15s ease-out;
|
|
568
204
|
}
|
|
569
|
-
|
|
570
|
-
.header {
|
|
571
|
-
display: flex;
|
|
572
|
-
justify-content: space-between;
|
|
573
|
-
align-items: center;
|
|
574
|
-
padding: 1rem 1.3rem 0.5rem;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
.header-divider {
|
|
578
|
-
padding-bottom: 1rem;
|
|
579
|
-
border-bottom: 1px solid var(--divider);
|
|
580
|
-
margin-bottom: 1rem;
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
.close,
|
|
584
|
-
.back {
|
|
585
|
-
width: 0.8rem;
|
|
586
|
-
height: 0.8rem;
|
|
587
|
-
opacity: 0;
|
|
588
|
-
transition: opacity 0.15s ease-in-out;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
.close.active,
|
|
592
|
-
.back.active {
|
|
593
|
-
opacity: 1;
|
|
594
|
-
cursor: pointer;
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
.body {
|
|
598
|
-
padding: 0 1.3rem 1.4rem;
|
|
599
|
-
min-width: 20rem;
|
|
600
|
-
display: flex;
|
|
601
|
-
flex-direction: column;
|
|
602
|
-
align-items: center;
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
.btn-primary {
|
|
606
|
-
width: 100%;
|
|
607
|
-
display: flex;
|
|
608
|
-
align-items: center;
|
|
609
|
-
justify-content: start;
|
|
610
|
-
padding: 0.75rem 1rem;
|
|
611
|
-
background: var(--btn-primary);
|
|
612
|
-
border-radius: 0.4rem;
|
|
613
|
-
transition: background 0.15s ease-in-out;
|
|
614
|
-
}
|
|
615
|
-
.btn-primary img {
|
|
616
|
-
width: 2rem;
|
|
617
|
-
height: 2rem;
|
|
618
|
-
margin-right: 1rem;
|
|
619
|
-
border-radius: 0.4rem;
|
|
620
|
-
}
|
|
621
|
-
.btn-primary:hover {
|
|
622
|
-
background: var(--btn-primary-hover);
|
|
623
|
-
}
|
|
624
|
-
.btn-primary:disabled {
|
|
625
|
-
cursor: not-allowed;
|
|
626
|
-
}
|
|
627
|
-
.btn-primary:disabled:hover {
|
|
628
|
-
background: var(--btn-primary);
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
.btn-secondary {
|
|
632
|
-
display: flex;
|
|
633
|
-
align-items: center;
|
|
634
|
-
padding: 0.25rem 1rem;
|
|
635
|
-
background: var(--btn-secondary);
|
|
636
|
-
border-radius: 9999px;
|
|
637
|
-
transition: background 0.15s ease-in-out;
|
|
638
|
-
}
|
|
639
|
-
.btn-secondary img {
|
|
640
|
-
width: 0.8rem;
|
|
641
|
-
height: 0.8rem;
|
|
642
|
-
margin-right: 0.5rem;
|
|
643
|
-
}
|
|
644
|
-
.btn-secondary:hover {
|
|
645
|
-
background: var(--btn-secondary-hover);
|
|
646
|
-
}
|
|
647
|
-
.btn-secondary:disabled {
|
|
648
|
-
cursor: not-allowed;
|
|
649
|
-
}
|
|
650
|
-
.btn-secondary:disabled:hover {
|
|
651
|
-
background: var(--btn-secondary);
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
.wallet-icon {
|
|
655
|
-
width: 4rem;
|
|
656
|
-
height: 4rem;
|
|
657
|
-
margin-bottom: 0.5rem;
|
|
658
|
-
border-radius: 0.8rem;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
.connecting-wallet-icon {
|
|
662
|
-
width: 5rem;
|
|
663
|
-
height: 5rem;
|
|
664
|
-
border-radius: 1rem;
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
.position-relative {
|
|
668
|
-
position: relative;
|
|
669
|
-
}
|
|
670
|
-
.position-absolute {
|
|
671
|
-
position: absolute;
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
.connected-type-icon {
|
|
675
|
-
position: absolute;
|
|
676
|
-
width: 1.5rem;
|
|
677
|
-
height: 1.5rem;
|
|
678
|
-
right: -0.5rem;
|
|
679
|
-
bottom: -0.5rem;
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
.text-center {
|
|
683
|
-
text-align: center;
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
.cursor-pointer {
|
|
687
|
-
cursor: pointer;
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
.flex {
|
|
691
|
-
display: flex;
|
|
692
|
-
}
|
|
693
|
-
.justify-center {
|
|
694
|
-
justify-content: center;
|
|
695
|
-
}
|
|
696
|
-
.justify-between {
|
|
697
|
-
justify-content: space-between;
|
|
698
|
-
}
|
|
699
|
-
.align-center {
|
|
700
|
-
align-items: center;
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
.switch-btn-container {
|
|
704
|
-
width: 100%;
|
|
705
|
-
padding: 1rem;
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
.switch-line {
|
|
709
|
-
flex: 1;
|
|
710
|
-
height: 1px;
|
|
711
|
-
background-color: var(--divider);
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
.switching-status-dot {
|
|
715
|
-
width: 0.5rem;
|
|
716
|
-
height: 0.5rem;
|
|
717
|
-
background: #0f0;
|
|
718
|
-
border-radius: 50%;
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
.copy-btn {
|
|
722
|
-
width: 1.5rem;
|
|
723
|
-
height: 1.5rem;
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
.copy-btn-sm {
|
|
727
|
-
width: 1rem;
|
|
728
|
-
height: 1rem;
|
|
729
|
-
}
|
|
730
|
-
|
|
731
|
-
.sm-chain-logo {
|
|
732
|
-
width: 1.125rem;
|
|
733
|
-
}
|
|
734
205
|
`;
|
|
735
206
|
}
|