@ckb-ccc/connector 0.0.5-alpha.1 → 0.0.5-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/assets/chains/ckb.sm.svg.d.ts +2 -0
  2. package/dist/assets/chains/ckb.sm.svg.d.ts.map +1 -0
  3. package/dist/assets/chains/ckb.sm.svg.js +2 -0
  4. package/dist/assets/copy.svg.d.ts +2 -0
  5. package/dist/assets/copy.svg.d.ts.map +1 -0
  6. package/dist/assets/copy.svg.js +2 -0
  7. package/dist/assets/diconnect.svg.d.ts +2 -0
  8. package/dist/assets/diconnect.svg.d.ts.map +1 -0
  9. package/dist/assets/diconnect.svg.js +2 -0
  10. package/dist/assets/swap.svg.d.ts +2 -0
  11. package/dist/assets/swap.svg.d.ts.map +1 -0
  12. package/dist/assets/swap.svg.js +2 -0
  13. package/dist/connector/index.d.ts +6 -2
  14. package/dist/connector/index.d.ts.map +1 -1
  15. package/dist/connector/index.js +276 -84
  16. package/dist/events/index.d.ts +3 -0
  17. package/dist/events/index.d.ts.map +1 -1
  18. package/dist/events/index.js +5 -0
  19. package/dist/scenes/connected.d.ts +4 -0
  20. package/dist/scenes/connected.d.ts.map +1 -0
  21. package/dist/scenes/connected.js +71 -0
  22. package/dist/scenes/connecting.d.ts +1 -1
  23. package/dist/scenes/connecting.d.ts.map +1 -1
  24. package/dist/scenes/connecting.js +9 -3
  25. package/dist/scenes/networks.d.ts +3 -0
  26. package/dist/scenes/networks.d.ts.map +1 -0
  27. package/dist/scenes/networks.js +38 -0
  28. package/dist/scenes/signers.d.ts.map +1 -1
  29. package/dist/scenes/signers.js +5 -2
  30. package/dist/scenes/wallets.d.ts +1 -1
  31. package/dist/scenes/wallets.d.ts.map +1 -1
  32. package/dist/scenes/wallets.js +9 -44
  33. package/package.json +3 -3
  34. package/src/assets/chains/ckb.sm.svg.ts +5 -0
  35. package/src/assets/copy.svg.ts +5 -0
  36. package/src/assets/diconnect.svg.ts +5 -0
  37. package/src/assets/swap.svg.ts +5 -0
  38. package/src/connector/index.ts +328 -108
  39. package/src/events/index.ts +6 -0
  40. package/src/scenes/connected.ts +87 -0
  41. package/src/scenes/connecting.ts +9 -2
  42. package/src/scenes/networks.ts +47 -0
  43. package/src/scenes/signers.ts +5 -2
  44. package/src/scenes/wallets.ts +20 -63
  45. package/dist.commonjs/tsconfig.commonjs.tsbuildinfo +0 -1
@@ -0,0 +1,2 @@
1
+ export declare const CKB_SM_SVG: string;
2
+ //# sourceMappingURL=ckb.sm.svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ckb.sm.svg.d.ts","sourceRoot":"","sources":["../../../src/assets/chains/ckb.sm.svg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,QAEtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { encodeSvgToImgSrc } from "../utils";
2
+ export const CKB_SM_SVG = encodeSvgToImgSrc('<svg width="19" height="18" viewBox="0 0 19 18" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_221_415)"><path d="M0.666992 9C0.666992 11.3869 1.6152 13.6761 3.30303 15.364C4.99086 17.0518 7.28004 18 9.66699 18C12.0539 18 14.3431 17.0518 16.031 15.364C17.7188 13.6761 18.667 11.3869 18.667 9C18.667 6.61305 17.7188 4.32387 16.031 2.63604C14.3431 0.948212 12.0539 0 9.66699 0C7.28004 0 4.99086 0.948212 3.30303 2.63604C1.6152 4.32387 0.666992 6.61305 0.666992 9Z" fill="#333333"/><path d="M5.51318 4.84619V12.9231H7.60395V8.52235H9.20549L5.51318 4.84619Z" fill="white"/><path d="M11.73 4.84619V9.24696H10.1284L13.8207 12.9231V4.84619H11.73Z" fill="white"/></g><defs><clipPath id="clip0_221_415"><rect width="18" height="18" fill="white" transform="translate(0.666992)"/></clipPath></defs></svg>');
@@ -0,0 +1,2 @@
1
+ export declare const COPY_SVG: string;
2
+ //# sourceMappingURL=copy.svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.svg.d.ts","sourceRoot":"","sources":["../../src/assets/copy.svg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,QAEpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+ export const COPY_SVG = encodeSvgToImgSrc('<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M19 13.5657V6.10526C19 5.49737 18.5091 5 17.9091 5H10.5454C9.94543 5 9.45452 5.49737 9.45452 6.10526V13.5657C9.45452 14.1736 9.94543 14.671 10.5454 14.671H17.9091C18.5091 14.671 19 14.1736 19 13.5657Z" fill="#999999"/><path d="M14.5455 15.8684H9.18183C8.58183 15.8684 8.09092 15.3711 8.09092 14.7632V9.329H6.09091C5.49091 9.329 5 9.82637 5 10.4343V17.8947C5 18.5026 5.49091 19 6.09091 19H13.4546C14.0546 19 14.5455 18.5026 14.5455 17.8947V15.8684Z" fill="#999999"/></svg>');
@@ -0,0 +1,2 @@
1
+ export declare const DISCONNECT_SVG: string;
2
+ //# sourceMappingURL=diconnect.svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diconnect.svg.d.ts","sourceRoot":"","sources":["../../src/assets/diconnect.svg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,QAE1B,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+ export const DISCONNECT_SVG = encodeSvgToImgSrc('<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect width="32" height="32" rx="8" fill="#DDDDDD"/><path d="M20.375 16.875H14.25V15.125H20.375L19.5 13.375H21.25L23 16L21.25 18.625H19.5L20.375 16.875ZM20.9509 11.051L19.7128 12.2886C19.226 11.8 18.6473 11.4125 18.0101 11.1484C17.3729 10.8844 16.6897 10.749 16 10.75C13.1006 10.75 10.75 13.1006 10.75 16C10.75 18.8994 13.1006 21.25 16 21.25C17.4107 21.25 18.7309 20.6923 19.71 19.7147L20.9462 20.9532C20.297 21.6031 19.5259 22.1184 18.6771 22.4696C17.8283 22.8209 16.9186 23.0011 16 23C12.1341 23 9 19.8659 9 16C9 12.1341 12.1341 9 16 9C17.8816 9 19.647 9.74667 20.9509 11.051Z" fill="#666666"/></svg>');
@@ -0,0 +1,2 @@
1
+ export declare const SWAP_SVG: string;
2
+ //# sourceMappingURL=swap.svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swap.svg.d.ts","sourceRoot":"","sources":["../../src/assets/swap.svg.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,QAEpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { encodeSvgToImgSrc } from "./utils";
2
+ export const SWAP_SVG = encodeSvgToImgSrc('<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M9.30688 5.22537L11.1669 3.36536L9.30688 1.50537" stroke="#666666" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.16699 3.36523H11.167" stroke="#666666" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/><path d="M4.02698 6.77539L2.16699 8.63541L4.02698 10.4954" stroke="#666666" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/><path d="M11.167 8.63525H2.16699" stroke="#666666" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/></svg>');
@@ -3,9 +3,8 @@ import { LitElement, PropertyValues } from "lit";
3
3
  import { Ref } from "lit/directives/ref.js";
4
4
  export declare class WebComponentConnector extends LitElement {
5
5
  private wallets;
6
+ signerFilter?: (signerInfo: ccc.SignerInfo, wallet: ccc.Wallet) => Promise<boolean>;
6
7
  private resetListeners;
7
- isOpen: boolean;
8
- setIsOpen(isOpen: boolean): void;
9
8
  name?: string;
10
9
  icon?: string;
11
10
  client: ccc.Client;
@@ -13,10 +12,15 @@ export declare class WebComponentConnector extends LitElement {
13
12
  private scene;
14
13
  private selectedWallet?;
15
14
  private selectedSigner?;
15
+ private connectingError?;
16
16
  private walletName?;
17
17
  private signerName?;
18
18
  wallet?: ccc.Wallet;
19
19
  signer?: ccc.SignerInfo;
20
+ private recommendAddress?;
21
+ private internalAddress?;
22
+ private balance?;
23
+ private updateSignerInfo;
20
24
  private prepareSigner;
21
25
  disconnect(): void;
22
26
  private loadConnection;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAa,MAAM,KAAK,CAAC;AAE5D,OAAO,EAAE,GAAG,EAAkB,MAAM,uBAAuB,CAAC;AAqB5D,qBACa,qBAAsB,SAAQ,UAAU;IAEnD,OAAO,CAAC,OAAO,CAA2B;IAE1C,OAAO,CAAC,cAAc,CAAsB;IAGrC,MAAM,EAAE,OAAO,CAAS;IACxB,SAAS,CAAC,MAAM,EAAE,OAAO;IAKzB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAiC;IACnD,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM;IAKnC,OAAO,CAAC,KAAK,CAAiC;IAE9C,OAAO,CAAC,cAAc,CAAC,CAAoB;IAE3C,OAAO,CAAC,cAAc,CAAC,CAAiB;IAGxC,OAAO,CAAC,UAAU,CAAC,CAAS;IAE5B,OAAO,CAAC,UAAU,CAAC,CAAS;IAErB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;IAC/B,OAAO,CAAC,aAAa;IAad,UAAU;IAOjB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAUtB,iBAAiB,IAAI,IAAI;IAMzB,UAAU,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IA0BnD,OAAO,CAAC,aAAa;IAiErB,OAAO,CAAC,SAAS;IA+BjB,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAC3C,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAC7C,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAE3C,MAAM;IA0EN,OAAO;IAUP,OAAO,CAAC,aAAa,CAanB;IAEF,OAAO,CAAC,qBAAqB,CAkB3B;IAEF,MAAM,CAAC,MAAM,0BA4IX;CACH"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/connector/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAa,MAAM,KAAK,CAAC;AAE5D,OAAO,EAAE,GAAG,EAAkB,MAAM,uBAAuB,CAAC;AAyB5D,qBACa,qBAAsB,SAAQ,UAAU;IAEnD,OAAO,CAAC,OAAO,CAA2B;IAEnC,YAAY,CAAC,EAAE,CACpB,UAAU,EAAE,GAAG,CAAC,UAAU,EAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,KACf,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtB,OAAO,CAAC,cAAc,CAAsB;IAGrC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,GAAG,CAAC,MAAM,CAAiC;IACnD,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM;IAKnC,OAAO,CAAC,KAAK,CAAiC;IAE9C,OAAO,CAAC,cAAc,CAAC,CAAoB;IAE3C,OAAO,CAAC,cAAc,CAAC,CAAiB;IAExC,OAAO,CAAC,eAAe,CAAC,CAAS;IAGjC,OAAO,CAAC,UAAU,CAAC,CAAS;IAE5B,OAAO,CAAC,UAAU,CAAC,CAAS;IAErB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC;IAG/B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAElC,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,OAAO,CAAC,CAAU;YAEZ,gBAAgB;YAUhB,aAAa;IAYpB,UAAU;IAQjB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAUtB,iBAAiB,IAAI,IAAI;IAMzB,UAAU,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAoCnD,OAAO,CAAC,aAAa;YA6FP,SAAS;IAyCvB,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAC3C,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAC7C,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,CAAe;IAE3C,MAAM;IA+FN,OAAO;IAUP,OAAO,CAAC,aAAa,CAgBnB;IAEF,OAAO,CAAC,qBAAqB,CAqC3B;IAEF,MAAM,CAAC,MAAM,0BAsPX;CACH"}
@@ -11,23 +11,26 @@ import { createRef, ref } from "lit/directives/ref.js";
11
11
  import { CLOSE_SVG } from "../assets/close.svg";
12
12
  import { JOY_ID_SVG } from "../assets/joy-id.svg";
13
13
  import { LEFT_SVG } from "../assets/left.svg";
14
+ import { METAMASK_SVG } from "../assets/metamask.svg";
14
15
  import { OKX_SVG } from "../assets/okx.svg";
15
16
  import { UNI_SAT_SVG } from "../assets/uni-sat.svg";
16
- import { WillUpdateEvent } from "../events";
17
+ import { ClosedEvent, WillUpdateEvent } from "../events";
17
18
  import { generateConnectingScene, generateSignersScene, generateWalletsScene, } from "../scenes";
19
+ import { generateConnectedScene } from "../scenes/connected";
20
+ import { generateNetworksScene } from "../scenes/networks";
18
21
  var Scene;
19
22
  (function (Scene) {
20
23
  Scene["SelectingWallets"] = "SelectingWallets";
21
24
  Scene["SelectingSigners"] = "SelectingSigners";
22
25
  Scene["Connecting"] = "Connecting";
23
26
  Scene["Connected"] = "Connected";
27
+ Scene["SwitchingNetworks"] = "SwitchingNetworks";
24
28
  })(Scene || (Scene = {}));
25
29
  let WebComponentConnector = class WebComponentConnector extends LitElement {
26
30
  constructor() {
27
31
  super(...arguments);
28
32
  this.wallets = [];
29
33
  this.resetListeners = [];
30
- this.isOpen = false;
31
34
  this.client = new ccc.ClientPublicTestnet();
32
35
  this.scene = Scene.SelectingWallets;
33
36
  this.mainRef = createRef();
@@ -43,47 +46,76 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
43
46
  this.selectedSigner = undefined;
44
47
  this.selectedWallet = undefined;
45
48
  }
46
- this.isOpen = false;
49
+ else if ([Scene.SwitchingNetworks].includes(this.scene)) {
50
+ this.scene = Scene.Connected;
51
+ }
52
+ this.dispatchEvent(new ClosedEvent());
47
53
  };
48
- this.signerSelectedHandler = (wallet, signer) => {
54
+ this.signerSelectedHandler = (wallet, signerInfo) => {
49
55
  this.scene = Scene.Connecting;
56
+ this.connectingError = undefined;
50
57
  this.selectedWallet = wallet;
51
- this.selectedSigner = signer;
58
+ this.selectedSigner = signerInfo;
52
59
  (async () => {
53
- await signer.signer.connect();
54
- if (!(await signer.signer.isConnected())) {
60
+ const { signer } = signerInfo;
61
+ try {
62
+ await signer.connect();
63
+ }
64
+ catch (error) {
65
+ if (typeof error === "object") {
66
+ const message = error?.message;
67
+ if (typeof message === "string") {
68
+ this.connectingError = message;
69
+ }
70
+ else {
71
+ this.connectingError = JSON.stringify(message);
72
+ }
73
+ return;
74
+ }
75
+ this.connectingError = JSON.stringify(error);
76
+ }
77
+ if (!(await signer.isConnected())) {
55
78
  return;
56
79
  }
57
80
  this.scene = Scene.Connected;
58
81
  this.walletName = wallet.name;
59
- this.signerName = signer.name;
82
+ this.signerName = signerInfo.name;
60
83
  this.saveConnection();
61
84
  this.closedHandler();
85
+ this.internalAddress = await signer.getInternalAddress();
86
+ this.recommendAddress = await signer.getRecommendedAddress();
87
+ this.balance = await signer.getBalance();
62
88
  })();
63
89
  };
64
90
  }
65
- setIsOpen(isOpen) {
66
- this.isOpen = isOpen;
67
- }
68
91
  setClient(client) {
69
92
  this.client = client;
70
93
  }
71
- prepareSigner() {
72
- (async () => {
73
- if (this.signer && (await this.signer.signer.isConnected())) {
74
- this.scene = Scene.Connected;
75
- return;
76
- }
77
- this.wallet = undefined;
78
- this.signer = undefined;
79
- this.scene = Scene.SelectingWallets;
80
- })();
94
+ async updateSignerInfo() {
95
+ const signer = this.signer?.signer;
96
+ if (!signer) {
97
+ return;
98
+ }
99
+ this.recommendAddress = await signer.getRecommendedAddress();
100
+ this.internalAddress = await signer.getInternalAddress();
101
+ this.balance = await signer.getBalance();
102
+ }
103
+ async prepareSigner() {
104
+ if (this.signer && (await this.signer.signer.isConnected())) {
105
+ await this.updateSignerInfo();
106
+ this.scene = Scene.Connected;
107
+ return;
108
+ }
109
+ this.wallet = undefined;
110
+ this.signer = undefined;
111
+ this.scene = Scene.SelectingWallets;
81
112
  }
82
113
  disconnect() {
83
114
  this.signer?.signer?.disconnect();
84
115
  this.walletName = undefined;
85
116
  this.signerName = undefined;
86
117
  this.saveConnection();
118
+ this.closedHandler();
87
119
  }
88
120
  loadConnection() {
89
121
  const { signerName, walletName, } = JSON.parse(window.localStorage.getItem("ccc-connection-info") ?? "{}");
@@ -102,17 +134,26 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
102
134
  this.reloadSigners();
103
135
  }
104
136
  willUpdate(changedProperties) {
105
- if (changedProperties.has("client")) {
137
+ if (changedProperties.has("client") ||
138
+ changedProperties.has("signerFilter")) {
106
139
  this.reloadSigners();
107
140
  }
108
- if (changedProperties.has("walletName") ||
109
- changedProperties.has("wallets")) {
110
- this.wallet = this.wallets.find(({ name }) => name === this.walletName);
111
- }
112
- if (changedProperties.has("signerName") ||
113
- changedProperties.has("wallet")) {
114
- const wallet = this.wallets.find(({ name }) => name === this.walletName);
115
- this.signer = wallet?.signers.find(({ name }) => name === this.signerName);
141
+ if ((changedProperties.has("scene") && this.scene === Scene.Connected) ||
142
+ changedProperties.has("wallets") ||
143
+ changedProperties.has("walletName") ||
144
+ changedProperties.has("signerName")) {
145
+ (async () => {
146
+ const wallet = this.wallets.find(({ name }) => name === this.walletName);
147
+ const signer = wallet?.signers.find(({ name }) => name === this.signerName);
148
+ if (signer && (await signer.signer.isConnected())) {
149
+ this.wallet = wallet;
150
+ this.signer = signer;
151
+ }
152
+ else {
153
+ this.wallet = undefined;
154
+ this.signer = undefined;
155
+ }
156
+ })();
116
157
  }
117
158
  if (changedProperties.has("signer")) {
118
159
  this.prepareSigner();
@@ -122,12 +163,13 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
122
163
  reloadSigners() {
123
164
  this.wallets = [];
124
165
  (async () => {
125
- if (!this.signer) {
166
+ const signer = this.signer;
167
+ if (!signer) {
126
168
  return;
127
169
  }
170
+ await signer.signer.replaceClient(this.client);
128
171
  this.signer = {
129
- ...this.signer,
130
- signer: await this.signer.signer.replaceClient(this.client),
172
+ ...signer,
131
173
  };
132
174
  })();
133
175
  this.resetListeners.forEach((listener) => listener());
@@ -136,45 +178,72 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
136
178
  document.querySelector("head title").text;
137
179
  const icon = this.icon ??
138
180
  document.querySelector('link[rel="icon"]').href;
139
- ccc.JoyId.getJoyIdSigners(this.client, name, icon).forEach(({ signer, type, name }) => {
140
- this.addSigner("JoyID", name, JOY_ID_SVG, type, signer);
181
+ ccc.JoyId.getJoyIdSigners(this.client, name, icon).forEach(({ signer, name }) => {
182
+ this.addSigner("JoyID", name, JOY_ID_SVG, signer);
141
183
  });
142
184
  const uniSatSigner = ccc.UniSat.getUniSatSigner(this.client);
143
185
  if (uniSatSigner) {
144
- this.addSigner("UniSat", "BTC", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
186
+ this.addSigner("UniSat", "BTC", UNI_SAT_SVG, uniSatSigner);
145
187
  }
146
188
  const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(this.client);
147
189
  if (okxBitcoinSigner) {
148
- this.addSigner("OKX Wallet", "BTC", OKX_SVG, ccc.SignerType.BTC, okxBitcoinSigner);
190
+ this.addSigner("OKX Wallet", "BTC", OKX_SVG, okxBitcoinSigner);
149
191
  }
150
192
  const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
151
193
  this.resetListeners.push(eip6963Manager.subscribeSigners((signer) => {
152
- this.addSigner(`${signer.detail.info.name}`, "EVM", signer.detail.info.icon, ccc.SignerType.EVM, signer);
194
+ this.addSigner(`${signer.detail.info.name}`, "EVM", signer.detail.info.icon, signer);
153
195
  }));
196
+ // === Dummy signers ===
197
+ this.addSigner("MetaMask", "EVM", METAMASK_SVG, new ccc.SignerOpenLink(this.client, ccc.SignerType.EVM, `https://metamask.app.link/dapp/${window.location.href}`));
198
+ [ccc.SignerType.EVM, ccc.SignerType.BTC].forEach((type) => {
199
+ this.addSigner("OKX Wallet", type, OKX_SVG, new ccc.SignerOpenLink(this.client, type, "https://www.okx.com/download?deeplink=" +
200
+ encodeURIComponent("okx://wallet/dapp/url?dappUrl=" +
201
+ encodeURIComponent(window.location.href))));
202
+ });
203
+ this.addSigner("UniSat", ccc.SignerType.BTC, UNI_SAT_SVG, new ccc.SignerOpenLink(this.client, ccc.SignerType.BTC, "https://unisat.io/download"));
204
+ // ===
154
205
  }
155
- addSigner(walletName, signerName, icon, type, signer) {
206
+ async addSigner(walletName, signerName, icon, signer) {
207
+ const signerInfo = { name: signerName, signer };
208
+ if (this.signerFilter &&
209
+ !(await this.signerFilter(signerInfo, { name: walletName, icon }))) {
210
+ return;
211
+ }
156
212
  let updated = false;
157
213
  const wallets = this.wallets.map((wallet) => {
158
214
  if (wallet.name !== walletName) {
159
215
  return wallet;
160
216
  }
161
217
  updated = true;
218
+ const allSigners = [...wallet.signers, signerInfo];
219
+ const signers = allSigners.filter(({ signer }) => !(signer instanceof ccc.SignerDummy));
162
220
  return {
163
221
  ...wallet,
164
- signers: [...wallet.signers, { type, name: signerName, signer }],
222
+ signers: signers.length !== 0 ? signers : [signerInfo],
165
223
  };
166
224
  });
167
225
  if (!updated) {
168
226
  wallets.push({
169
227
  name: walletName,
170
228
  icon,
171
- signers: [{ type, name: signerName, signer }],
229
+ signers: [signerInfo],
172
230
  });
173
231
  }
174
232
  this.wallets = wallets;
175
233
  }
176
234
  render() {
177
235
  const [title, body] = (() => {
236
+ if (this.scene === Scene.Connected && this.wallet && this.signer) {
237
+ return generateConnectedScene(this.wallet, this.signer, this.recommendAddress, this.internalAddress, this.balance, this.disconnect.bind(this), () => {
238
+ this.scene = Scene.SwitchingNetworks;
239
+ });
240
+ }
241
+ if (this.scene === Scene.SwitchingNetworks) {
242
+ return generateNetworksScene(this.client, (client) => {
243
+ this.setClient(client);
244
+ this.closedHandler();
245
+ });
246
+ }
178
247
  if (this.scene === Scene.SelectingWallets || !this.selectedWallet) {
179
248
  return generateWalletsScene(this.wallets, (wallet) => {
180
249
  this.selectedWallet = wallet;
@@ -184,53 +253,58 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
184
253
  if (this.scene === Scene.SelectingSigners || !this.selectedSigner) {
185
254
  return generateSignersScene(this.selectedWallet, this.signerSelectedHandler);
186
255
  }
187
- return generateConnectingScene(this.selectedWallet, this.selectedSigner, this.signerSelectedHandler);
256
+ return generateConnectingScene(this.selectedWallet, this.selectedSigner, this.connectingError, this.signerSelectedHandler);
188
257
  })();
189
- const canBack = [Scene.SelectingSigners, Scene.Connecting].includes(this.scene);
190
- return html `<style>
191
- :host {
192
- ${this.isOpen ? "" : "display: none;"}
193
- --background: #fff;
194
- --divider: #eee;
195
- --btn-primary: #f8f8f8;
196
- --btn-primary-hover: #efeeee;
197
- --btn-secondary: #ddd;
198
- color: #1e1e1e;
199
- --tip-color: #666;
200
- }
201
- </style>
202
- <div
203
- class="background"
204
- @click=${(event) => {
258
+ const canBack = [
259
+ Scene.SelectingSigners,
260
+ Scene.Connecting,
261
+ Scene.SwitchingNetworks,
262
+ ].includes(this.scene);
263
+ return html ` <div
264
+ class="background"
265
+ @click=${(event) => {
205
266
  if (event.target === event.currentTarget) {
206
267
  this.closedHandler();
207
268
  }
208
269
  }}
209
- >
210
- <div class="main" ${ref(this.mainRef)}>
211
- <div class="header text-bold fs-big" ${ref(this.headerRef)}>
212
- <img
213
- class="back ${canBack ? "active" : ""}"
214
- src=${LEFT_SVG}
215
- @click=${() => {
270
+ >
271
+ <div class="main" ${ref(this.mainRef)}>
272
+ <div
273
+ class="header text-bold fs-lg ${title == null
274
+ ? ""
275
+ : "header-divider"}"
276
+ ${ref(this.headerRef)}
277
+ >
278
+ <img
279
+ class="back ${canBack ? "active" : ""}"
280
+ src=${LEFT_SVG}
281
+ @click=${() => {
216
282
  if (this.scene === Scene.Connecting) {
217
- this.scene = Scene.SelectingSigners;
283
+ if ((this.selectedWallet?.signers.length ?? 0) <= 1) {
284
+ this.scene = Scene.SelectingWallets;
285
+ }
286
+ else {
287
+ this.scene = Scene.SelectingSigners;
288
+ }
218
289
  }
219
290
  else if (this.scene === Scene.SelectingSigners) {
220
291
  this.scene = Scene.SelectingWallets;
221
292
  }
293
+ else if (this.scene === Scene.SwitchingNetworks) {
294
+ this.scene = Scene.Connected;
295
+ }
222
296
  }}
223
- />
224
- ${title}
225
- <img
226
- class="close active"
227
- src=${CLOSE_SVG}
228
- @click=${this.closedHandler}
229
- />
230
- </div>
231
- <div class="body" ${ref(this.bodyRef)}>${body}</div>
297
+ />
298
+ ${title}
299
+ <img
300
+ class="close active"
301
+ src=${CLOSE_SVG}
302
+ @click=${this.closedHandler}
303
+ />
232
304
  </div>
233
- </div>`;
305
+ <div class="body" ${ref(this.bodyRef)}>${body}</div>
306
+ </div>
307
+ </div>`;
234
308
  }
235
309
  updated() {
236
310
  if (!this.mainRef.value) {
@@ -267,9 +341,18 @@ WebComponentConnector.styles = css `
267
341
  color: var(--tip-color);
268
342
  }
269
343
 
270
- .fs-big {
344
+ .fs-sm {
345
+ font-size: 0.8rem;
346
+ }
347
+ .fs-md {
348
+ font-size: 1rem;
349
+ }
350
+ .fs-lg {
271
351
  font-size: 1.2rem;
272
352
  }
353
+ .fs-xl {
354
+ font-size: 1.5rem;
355
+ }
273
356
 
274
357
  .mb-1 {
275
358
  margin-bottom: 0.7rem;
@@ -283,6 +366,18 @@ WebComponentConnector.styles = css `
283
366
  .mt-2 {
284
367
  margin-top: 1rem;
285
368
  }
369
+ .ml-1 {
370
+ margin-left: 0.7rem;
371
+ }
372
+ .ml-2 {
373
+ margin-left: 1em;
374
+ }
375
+ .mr-1 {
376
+ margin-right: 0.7rem;
377
+ }
378
+ .mr-2 {
379
+ margin-right: 1rem;
380
+ }
286
381
 
287
382
  .background {
288
383
  width: 100%;
@@ -305,8 +400,13 @@ WebComponentConnector.styles = css `
305
400
  display: flex;
306
401
  justify-content: space-between;
307
402
  align-items: center;
308
- padding: 1rem 1.3rem;
403
+ padding: 1rem 1.3rem 0.5rem;
404
+ }
405
+
406
+ .header-divider {
407
+ padding-bottom: 1rem;
309
408
  border-bottom: 1px solid var(--divider);
409
+ margin-bottom: 1rem;
310
410
  }
311
411
 
312
412
  .close,
@@ -324,7 +424,7 @@ WebComponentConnector.styles = css `
324
424
  }
325
425
 
326
426
  .body {
327
- padding: 1.4rem 1.3rem;
427
+ padding: 0 1.3rem 1.4rem;
328
428
  min-width: 20rem;
329
429
  display: flex;
330
430
  flex-direction: column;
@@ -341,17 +441,21 @@ WebComponentConnector.styles = css `
341
441
  border-radius: 0.4rem;
342
442
  transition: background 0.15s ease-in-out;
343
443
  }
344
-
345
444
  .btn-primary img {
346
445
  width: 2rem;
347
446
  height: 2rem;
348
447
  margin-right: 1rem;
349
448
  border-radius: 0.4rem;
350
449
  }
351
-
352
450
  .btn-primary:hover {
353
451
  background: var(--btn-primary-hover);
354
452
  }
453
+ .btn-primary:disabled {
454
+ cursor: not-allowed;
455
+ }
456
+ .btn-primary:disabled:hover {
457
+ background: var(--btn-primary);
458
+ }
355
459
 
356
460
  .btn-secondary {
357
461
  display: flex;
@@ -361,12 +465,20 @@ WebComponentConnector.styles = css `
361
465
  border-radius: 9999px;
362
466
  transition: background 0.15s ease-in-out;
363
467
  }
364
-
365
468
  .btn-secondary img {
366
469
  width: 0.8rem;
367
470
  height: 0.8rem;
368
471
  margin-right: 0.5rem;
369
472
  }
473
+ .btn-secondary:hover {
474
+ background: var(--btn-secondary-hover);
475
+ }
476
+ .btn-secondary:disabled {
477
+ cursor: not-allowed;
478
+ }
479
+ .btn-secondary:disabled:hover {
480
+ background: var(--btn-secondary);
481
+ }
370
482
 
371
483
  .wallet-icon {
372
484
  width: 4rem;
@@ -380,13 +492,81 @@ WebComponentConnector.styles = css `
380
492
  height: 5rem;
381
493
  border-radius: 1rem;
382
494
  }
495
+
496
+ .position-relative {
497
+ position: relative;
498
+ }
499
+ .position-absolute {
500
+ position: absolute;
501
+ }
502
+
503
+ .connected-type-icon {
504
+ position: absolute;
505
+ width: 1.5rem;
506
+ height: 1.5rem;
507
+ right: -0.5rem;
508
+ bottom: -0.5rem;
509
+ }
510
+
511
+ .text-center {
512
+ text-align: center;
513
+ }
514
+
515
+ .cursor-pointer {
516
+ cursor: pointer;
517
+ }
518
+
519
+ .flex {
520
+ display: flex;
521
+ }
522
+ .justify-center {
523
+ justify-content: center;
524
+ }
525
+ .justify-between {
526
+ justify-content: space-between;
527
+ }
528
+ .align-center {
529
+ align-items: center;
530
+ }
531
+
532
+ .switch-btn-container {
533
+ width: 100%;
534
+ padding: 1rem;
535
+ }
536
+
537
+ .switch-line {
538
+ flex: 1;
539
+ height: 1px;
540
+ background-color: var(--divider);
541
+ }
542
+
543
+ .switching-status-dot {
544
+ width: 0.5rem;
545
+ height: 0.5rem;
546
+ background: #0f0;
547
+ border-radius: 50%;
548
+ }
549
+
550
+ .copy-btn {
551
+ width: 1.5rem;
552
+ height: 1.5rem;
553
+ }
554
+
555
+ .copy-btn-sm {
556
+ width: 1rem;
557
+ height: 1rem;
558
+ }
559
+
560
+ .sm-chain-logo {
561
+ width: 1.125rem;
562
+ }
383
563
  `;
384
564
  __decorate([
385
565
  state()
386
566
  ], WebComponentConnector.prototype, "wallets", void 0);
387
567
  __decorate([
388
- state()
389
- ], WebComponentConnector.prototype, "isOpen", void 0);
568
+ property()
569
+ ], WebComponentConnector.prototype, "signerFilter", void 0);
390
570
  __decorate([
391
571
  property()
392
572
  ], WebComponentConnector.prototype, "name", void 0);
@@ -405,6 +585,9 @@ __decorate([
405
585
  __decorate([
406
586
  state()
407
587
  ], WebComponentConnector.prototype, "selectedSigner", void 0);
588
+ __decorate([
589
+ state()
590
+ ], WebComponentConnector.prototype, "connectingError", void 0);
408
591
  __decorate([
409
592
  state()
410
593
  ], WebComponentConnector.prototype, "walletName", void 0);
@@ -417,6 +600,15 @@ __decorate([
417
600
  __decorate([
418
601
  state()
419
602
  ], WebComponentConnector.prototype, "signer", void 0);
603
+ __decorate([
604
+ state()
605
+ ], WebComponentConnector.prototype, "recommendAddress", void 0);
606
+ __decorate([
607
+ state()
608
+ ], WebComponentConnector.prototype, "internalAddress", void 0);
609
+ __decorate([
610
+ state()
611
+ ], WebComponentConnector.prototype, "balance", void 0);
420
612
  WebComponentConnector = __decorate([
421
613
  customElement("ccc-connector")
422
614
  ], WebComponentConnector);
@@ -1,4 +1,7 @@
1
1
  export declare class WillUpdateEvent extends Event {
2
2
  constructor();
3
3
  }
4
+ export declare class ClosedEvent extends Event {
5
+ constructor();
6
+ }
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;;CAIzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAgB,SAAQ,KAAK;;CAIzC;AAED,qBAAa,WAAY,SAAQ,KAAK;;CAIrC"}