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

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/advancedBarrel.d.ts +1 -0
  2. package/dist/advancedBarrel.d.ts.map +1 -1
  3. package/dist/advancedBarrel.js +1 -0
  4. package/dist/assets/chains/ckb.sm.svg.d.ts +2 -0
  5. package/dist/assets/chains/ckb.sm.svg.d.ts.map +1 -0
  6. package/dist/assets/chains/ckb.sm.svg.js +2 -0
  7. package/dist/assets/copy.svg.d.ts +2 -0
  8. package/dist/assets/copy.svg.d.ts.map +1 -0
  9. package/dist/assets/copy.svg.js +2 -0
  10. package/dist/assets/diconnect.svg.d.ts +2 -0
  11. package/dist/assets/diconnect.svg.d.ts.map +1 -0
  12. package/dist/assets/diconnect.svg.js +2 -0
  13. package/dist/assets/swap.svg.d.ts +2 -0
  14. package/dist/assets/swap.svg.d.ts.map +1 -0
  15. package/dist/assets/swap.svg.js +2 -0
  16. package/dist/connector/index.d.ts +5 -0
  17. package/dist/connector/index.d.ts.map +1 -1
  18. package/dist/connector/index.js +225 -34
  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/networks.d.ts +3 -0
  23. package/dist/scenes/networks.d.ts.map +1 -0
  24. package/dist/scenes/networks.js +38 -0
  25. package/dist/scenes/signers.d.ts.map +1 -1
  26. package/dist/scenes/signers.js +5 -2
  27. package/dist/scenes/wallets.d.ts +1 -1
  28. package/dist/scenes/wallets.d.ts.map +1 -1
  29. package/dist/scenes/wallets.js +9 -44
  30. package/dist/signerOpenLink/index.d.ts +13 -0
  31. package/dist/signerOpenLink/index.d.ts.map +1 -0
  32. package/dist/signerOpenLink/index.js +26 -0
  33. package/package.json +3 -3
  34. package/src/advancedBarrel.ts +1 -0
  35. package/src/assets/chains/ckb.sm.svg.ts +5 -0
  36. package/src/assets/copy.svg.ts +5 -0
  37. package/src/assets/diconnect.svg.ts +5 -0
  38. package/src/assets/swap.svg.ts +5 -0
  39. package/src/connector/index.ts +270 -52
  40. package/src/scenes/connected.ts +87 -0
  41. package/src/scenes/networks.ts +47 -0
  42. package/src/scenes/signers.ts +5 -2
  43. package/src/scenes/wallets.ts +20 -63
  44. package/src/signerOpenLink/index.ts +35 -0
  45. package/dist.commonjs/tsconfig.commonjs.tsbuildinfo +0 -1
@@ -1,4 +1,5 @@
1
1
  export * from "@ckb-ccc/ccc/advancedBarrel";
2
2
  export * from "./scenes";
3
+ export * from "./signerOpenLink";
3
4
  export * from "./types";
4
5
  //# sourceMappingURL=advancedBarrel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"advancedBarrel.d.ts","sourceRoot":"","sources":["../src/advancedBarrel.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export * from "@ckb-ccc/ccc/advancedBarrel";
2
2
  export * from "./scenes";
3
+ export * from "./signerOpenLink";
3
4
  export * from "./types";
@@ -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,6 +3,7 @@ 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
8
  isOpen: boolean;
8
9
  setIsOpen(isOpen: boolean): void;
@@ -17,6 +18,10 @@ export declare class WebComponentConnector extends LitElement {
17
18
  private signerName?;
18
19
  wallet?: ccc.Wallet;
19
20
  signer?: ccc.SignerInfo;
21
+ private recommendAddress?;
22
+ private internalAddress?;
23
+ private balance?;
24
+ private updateSignerInfo;
20
25
  private prepareSigner;
21
26
  disconnect(): void;
22
27
  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;AA0B5D,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,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;IAG/B,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAElC,OAAO,CAAC,eAAe,CAAC,CAAS;IAEjC,OAAO,CAAC,OAAO,CAAC,CAAU;YAEZ,gBAAgB;YAShB,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;YA2FP,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;IA2GN,OAAO;IAUP,OAAO,CAAC,aAAa,CAgBnB;IAEF,OAAO,CAAC,qBAAqB,CAqB3B;IAEF,MAAM,CAAC,MAAM,0BAsPX;CACH"}
@@ -11,16 +11,21 @@ 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
17
  import { WillUpdateEvent } from "../events";
17
18
  import { generateConnectingScene, generateSignersScene, generateWalletsScene, } from "../scenes";
19
+ import { generateConnectedScene } from "../scenes/connected";
20
+ import { generateNetworksScene } from "../scenes/networks";
21
+ import { SignerOpenLink } from "../signerOpenLink";
18
22
  var Scene;
19
23
  (function (Scene) {
20
24
  Scene["SelectingWallets"] = "SelectingWallets";
21
25
  Scene["SelectingSigners"] = "SelectingSigners";
22
26
  Scene["Connecting"] = "Connecting";
23
27
  Scene["Connected"] = "Connected";
28
+ Scene["SwitchingNetworks"] = "SwitchingNetworks";
24
29
  })(Scene || (Scene = {}));
25
30
  let WebComponentConnector = class WebComponentConnector extends LitElement {
26
31
  constructor() {
@@ -43,6 +48,9 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
43
48
  this.selectedSigner = undefined;
44
49
  this.selectedWallet = undefined;
45
50
  }
51
+ else if ([Scene.SwitchingNetworks].includes(this.scene)) {
52
+ this.scene = Scene.Connected;
53
+ }
46
54
  this.isOpen = false;
47
55
  };
48
56
  this.signerSelectedHandler = (wallet, signer) => {
@@ -59,6 +67,9 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
59
67
  this.signerName = signer.name;
60
68
  this.saveConnection();
61
69
  this.closedHandler();
70
+ this.internalAddress = await signer.signer.getInternalAddress();
71
+ this.recommendAddress = await signer.signer.getRecommendedAddress();
72
+ this.balance = await signer.signer.getBalance();
62
73
  })();
63
74
  };
64
75
  }
@@ -68,22 +79,30 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
68
79
  setClient(client) {
69
80
  this.client = client;
70
81
  }
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
- })();
82
+ async updateSignerInfo() {
83
+ if (!this.signer) {
84
+ return;
85
+ }
86
+ this.recommendAddress = await this.signer.signer.getRecommendedAddress();
87
+ this.balance = await this.signer.signer.getBalance();
88
+ this.internalAddress = await this.signer.signer.getInternalAddress();
89
+ }
90
+ async prepareSigner() {
91
+ if (this.signer && (await this.signer.signer.isConnected())) {
92
+ await this.updateSignerInfo();
93
+ this.scene = Scene.Connected;
94
+ return;
95
+ }
96
+ this.wallet = undefined;
97
+ this.signer = undefined;
98
+ this.scene = Scene.SelectingWallets;
81
99
  }
82
100
  disconnect() {
83
101
  this.signer?.signer?.disconnect();
84
102
  this.walletName = undefined;
85
103
  this.signerName = undefined;
86
104
  this.saveConnection();
105
+ this.closedHandler();
87
106
  }
88
107
  loadConnection() {
89
108
  const { signerName, walletName, } = JSON.parse(window.localStorage.getItem("ccc-connection-info") ?? "{}");
@@ -102,17 +121,26 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
102
121
  this.reloadSigners();
103
122
  }
104
123
  willUpdate(changedProperties) {
105
- if (changedProperties.has("client")) {
124
+ if (changedProperties.has("client") ||
125
+ changedProperties.has("signerFilter")) {
106
126
  this.reloadSigners();
107
127
  }
108
128
  if (changedProperties.has("walletName") ||
109
- changedProperties.has("wallets")) {
110
- this.wallet = this.wallets.find(({ name }) => name === this.walletName);
111
- }
112
- if (changedProperties.has("signerName") ||
129
+ changedProperties.has("wallets") ||
130
+ changedProperties.has("signerName") ||
113
131
  changedProperties.has("wallet")) {
114
- const wallet = this.wallets.find(({ name }) => name === this.walletName);
115
- this.signer = wallet?.signers.find(({ name }) => name === this.signerName);
132
+ (async () => {
133
+ const wallet = this.wallets.find(({ name }) => name === this.walletName);
134
+ const signer = wallet?.signers.find(({ name }) => name === this.signerName);
135
+ if (signer && (await signer.signer.isConnected())) {
136
+ this.wallet = wallet;
137
+ this.signer = signer;
138
+ }
139
+ else {
140
+ this.wallet = undefined;
141
+ this.signer = undefined;
142
+ }
143
+ })();
116
144
  }
117
145
  if (changedProperties.has("signer")) {
118
146
  this.prepareSigner();
@@ -136,45 +164,72 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
136
164
  document.querySelector("head title").text;
137
165
  const icon = this.icon ??
138
166
  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);
167
+ ccc.JoyId.getJoyIdSigners(this.client, name, icon).forEach(({ signer, name }) => {
168
+ this.addSigner("JoyID", name, JOY_ID_SVG, signer);
141
169
  });
142
170
  const uniSatSigner = ccc.UniSat.getUniSatSigner(this.client);
143
171
  if (uniSatSigner) {
144
- this.addSigner("UniSat", "BTC", UNI_SAT_SVG, ccc.SignerType.BTC, uniSatSigner);
172
+ this.addSigner("UniSat", "BTC", UNI_SAT_SVG, uniSatSigner);
145
173
  }
146
174
  const okxBitcoinSigner = ccc.Okx.getOKXBitcoinSigner(this.client);
147
175
  if (okxBitcoinSigner) {
148
- this.addSigner("OKX Wallet", "BTC", OKX_SVG, ccc.SignerType.BTC, okxBitcoinSigner);
176
+ this.addSigner("OKX Wallet", "BTC", OKX_SVG, okxBitcoinSigner);
149
177
  }
150
178
  const eip6963Manager = new ccc.Eip6963.SignerFactory(this.client);
151
179
  this.resetListeners.push(eip6963Manager.subscribeSigners((signer) => {
152
- this.addSigner(`${signer.detail.info.name}`, "EVM", signer.detail.info.icon, ccc.SignerType.EVM, signer);
180
+ this.addSigner(`${signer.detail.info.name}`, "EVM", signer.detail.info.icon, signer);
153
181
  }));
182
+ // === Dummy signers ===
183
+ this.addSigner("MetaMask", "EVM", METAMASK_SVG, new SignerOpenLink(this.client, `https://metamask.app.link/dapp/${window.location.href}`, ccc.SignerType.EVM));
184
+ [ccc.SignerType.EVM, ccc.SignerType.BTC].forEach((type) => {
185
+ this.addSigner("OKX Wallet", type, OKX_SVG, new SignerOpenLink(this.client, "https://www.okx.com/download?deeplink=" +
186
+ encodeURIComponent("okx://wallet/dapp/url?dappUrl=" +
187
+ encodeURIComponent(window.location.href)), type));
188
+ });
189
+ this.addSigner("UniSat", ccc.SignerType.BTC, UNI_SAT_SVG, new SignerOpenLink(this.client, "https://unisat.io/download", ccc.SignerType.BTC));
190
+ // ===
154
191
  }
155
- addSigner(walletName, signerName, icon, type, signer) {
192
+ async addSigner(walletName, signerName, icon, signer) {
193
+ const signerInfo = { name: signerName, signer };
194
+ if (this.signerFilter &&
195
+ !(await this.signerFilter(signerInfo, { name: walletName, icon }))) {
196
+ return;
197
+ }
156
198
  let updated = false;
157
199
  const wallets = this.wallets.map((wallet) => {
158
200
  if (wallet.name !== walletName) {
159
201
  return wallet;
160
202
  }
161
203
  updated = true;
204
+ const allSigners = [...wallet.signers, signerInfo];
205
+ const signers = allSigners.filter(({ signer }) => !(signer instanceof SignerOpenLink));
162
206
  return {
163
207
  ...wallet,
164
- signers: [...wallet.signers, { type, name: signerName, signer }],
208
+ signers: signers.length !== 0 ? signers : [signerInfo],
165
209
  };
166
210
  });
167
211
  if (!updated) {
168
212
  wallets.push({
169
213
  name: walletName,
170
214
  icon,
171
- signers: [{ type, name: signerName, signer }],
215
+ signers: [signerInfo],
172
216
  });
173
217
  }
174
218
  this.wallets = wallets;
175
219
  }
176
220
  render() {
177
221
  const [title, body] = (() => {
222
+ if (this.scene === Scene.Connected && this.wallet && this.signer) {
223
+ return generateConnectedScene(this.wallet, this.signer, this.recommendAddress, this.internalAddress, this.balance, this.disconnect.bind(this), () => {
224
+ this.scene = Scene.SwitchingNetworks;
225
+ });
226
+ }
227
+ if (this.scene === Scene.SwitchingNetworks) {
228
+ return generateNetworksScene(this.client, (client) => {
229
+ this.setClient(client);
230
+ this.closedHandler();
231
+ });
232
+ }
178
233
  if (this.scene === Scene.SelectingWallets || !this.selectedWallet) {
179
234
  return generateWalletsScene(this.wallets, (wallet) => {
180
235
  this.selectedWallet = wallet;
@@ -186,7 +241,11 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
186
241
  }
187
242
  return generateConnectingScene(this.selectedWallet, this.selectedSigner, this.signerSelectedHandler);
188
243
  })();
189
- const canBack = [Scene.SelectingSigners, Scene.Connecting].includes(this.scene);
244
+ const canBack = [
245
+ Scene.SelectingSigners,
246
+ Scene.Connecting,
247
+ Scene.SwitchingNetworks,
248
+ ].includes(this.scene);
190
249
  return html `<style>
191
250
  :host {
192
251
  ${this.isOpen ? "" : "display: none;"}
@@ -195,6 +254,7 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
195
254
  --btn-primary: #f8f8f8;
196
255
  --btn-primary-hover: #efeeee;
197
256
  --btn-secondary: #ddd;
257
+ --btn-secondary-hover: #ccc;
198
258
  color: #1e1e1e;
199
259
  --tip-color: #666;
200
260
  }
@@ -208,17 +268,30 @@ let WebComponentConnector = class WebComponentConnector extends LitElement {
208
268
  }}
209
269
  >
210
270
  <div class="main" ${ref(this.mainRef)}>
211
- <div class="header text-bold fs-big" ${ref(this.headerRef)}>
271
+ <div
272
+ class="header text-bold fs-lg ${title == null
273
+ ? ""
274
+ : "header-divider"}"
275
+ ${ref(this.headerRef)}
276
+ >
212
277
  <img
213
278
  class="back ${canBack ? "active" : ""}"
214
279
  src=${LEFT_SVG}
215
280
  @click=${() => {
216
281
  if (this.scene === Scene.Connecting) {
217
- this.scene = Scene.SelectingSigners;
282
+ if ((this.selectedWallet?.signers.length ?? 0) <= 1) {
283
+ this.scene = Scene.SelectingWallets;
284
+ }
285
+ else {
286
+ this.scene = Scene.SelectingSigners;
287
+ }
218
288
  }
219
289
  else if (this.scene === Scene.SelectingSigners) {
220
290
  this.scene = Scene.SelectingWallets;
221
291
  }
292
+ else if (this.scene === Scene.SwitchingNetworks) {
293
+ this.scene = Scene.Connected;
294
+ }
222
295
  }}
223
296
  />
224
297
  ${title}
@@ -267,9 +340,18 @@ WebComponentConnector.styles = css `
267
340
  color: var(--tip-color);
268
341
  }
269
342
 
270
- .fs-big {
343
+ .fs-sm {
344
+ font-size: 0.8rem;
345
+ }
346
+ .fs-md {
347
+ font-size: 1rem;
348
+ }
349
+ .fs-lg {
271
350
  font-size: 1.2rem;
272
351
  }
352
+ .fs-xl {
353
+ font-size: 1.5rem;
354
+ }
273
355
 
274
356
  .mb-1 {
275
357
  margin-bottom: 0.7rem;
@@ -283,6 +365,18 @@ WebComponentConnector.styles = css `
283
365
  .mt-2 {
284
366
  margin-top: 1rem;
285
367
  }
368
+ .ml-1 {
369
+ margin-left: 0.7rem;
370
+ }
371
+ .ml-2 {
372
+ margin-left: 1em;
373
+ }
374
+ .mr-1 {
375
+ margin-right: 0.7rem;
376
+ }
377
+ .mr-2 {
378
+ margin-right: 1rem;
379
+ }
286
380
 
287
381
  .background {
288
382
  width: 100%;
@@ -305,8 +399,13 @@ WebComponentConnector.styles = css `
305
399
  display: flex;
306
400
  justify-content: space-between;
307
401
  align-items: center;
308
- padding: 1rem 1.3rem;
402
+ padding: 1rem 1.3rem 0.5rem;
403
+ }
404
+
405
+ .header-divider {
406
+ padding-bottom: 1rem;
309
407
  border-bottom: 1px solid var(--divider);
408
+ margin-bottom: 1rem;
310
409
  }
311
410
 
312
411
  .close,
@@ -324,7 +423,7 @@ WebComponentConnector.styles = css `
324
423
  }
325
424
 
326
425
  .body {
327
- padding: 1.4rem 1.3rem;
426
+ padding: 0 1.3rem 1.4rem;
328
427
  min-width: 20rem;
329
428
  display: flex;
330
429
  flex-direction: column;
@@ -341,17 +440,21 @@ WebComponentConnector.styles = css `
341
440
  border-radius: 0.4rem;
342
441
  transition: background 0.15s ease-in-out;
343
442
  }
344
-
345
443
  .btn-primary img {
346
444
  width: 2rem;
347
445
  height: 2rem;
348
446
  margin-right: 1rem;
349
447
  border-radius: 0.4rem;
350
448
  }
351
-
352
449
  .btn-primary:hover {
353
450
  background: var(--btn-primary-hover);
354
451
  }
452
+ .btn-primary:disabled {
453
+ cursor: not-allowed;
454
+ }
455
+ .btn-primary:disabled:hover {
456
+ background: var(--btn-primary);
457
+ }
355
458
 
356
459
  .btn-secondary {
357
460
  display: flex;
@@ -361,12 +464,20 @@ WebComponentConnector.styles = css `
361
464
  border-radius: 9999px;
362
465
  transition: background 0.15s ease-in-out;
363
466
  }
364
-
365
467
  .btn-secondary img {
366
468
  width: 0.8rem;
367
469
  height: 0.8rem;
368
470
  margin-right: 0.5rem;
369
471
  }
472
+ .btn-secondary:hover {
473
+ background: var(--btn-secondary-hover);
474
+ }
475
+ .btn-secondary:disabled {
476
+ cursor: not-allowed;
477
+ }
478
+ .btn-secondary:disabled:hover {
479
+ background: var(--btn-secondary);
480
+ }
370
481
 
371
482
  .wallet-icon {
372
483
  width: 4rem;
@@ -380,10 +491,81 @@ WebComponentConnector.styles = css `
380
491
  height: 5rem;
381
492
  border-radius: 1rem;
382
493
  }
494
+
495
+ .position-relative {
496
+ position: relative;
497
+ }
498
+ .position-absolute {
499
+ position: absolute;
500
+ }
501
+
502
+ .connected-type-icon {
503
+ position: absolute;
504
+ width: 1.5rem;
505
+ height: 1.5rem;
506
+ right: -0.5rem;
507
+ bottom: -0.5rem;
508
+ }
509
+
510
+ .text-center {
511
+ text-align: center;
512
+ }
513
+
514
+ .cursor-pointer {
515
+ cursor: pointer;
516
+ }
517
+
518
+ .flex {
519
+ display: flex;
520
+ }
521
+ .justify-center {
522
+ justify-content: center;
523
+ }
524
+ .justify-between {
525
+ justify-content: space-between;
526
+ }
527
+ .align-center {
528
+ align-items: center;
529
+ }
530
+
531
+ .switch-btn-container {
532
+ width: 100%;
533
+ padding: 1rem;
534
+ }
535
+
536
+ .switch-line {
537
+ flex: 1;
538
+ height: 1px;
539
+ background-color: var(--divider);
540
+ }
541
+
542
+ .switching-status-dot {
543
+ width: 0.5rem;
544
+ height: 0.5rem;
545
+ background: #0f0;
546
+ border-radius: 50%;
547
+ }
548
+
549
+ .copy-btn {
550
+ width: 1.5rem;
551
+ height: 1.5rem;
552
+ }
553
+
554
+ .copy-btn-sm {
555
+ width: 1rem;
556
+ height: 1rem;
557
+ }
558
+
559
+ .sm-chain-logo {
560
+ width: 1.125rem;
561
+ }
383
562
  `;
384
563
  __decorate([
385
564
  state()
386
565
  ], WebComponentConnector.prototype, "wallets", void 0);
566
+ __decorate([
567
+ property()
568
+ ], WebComponentConnector.prototype, "signerFilter", void 0);
387
569
  __decorate([
388
570
  state()
389
571
  ], WebComponentConnector.prototype, "isOpen", void 0);
@@ -417,6 +599,15 @@ __decorate([
417
599
  __decorate([
418
600
  state()
419
601
  ], WebComponentConnector.prototype, "signer", void 0);
602
+ __decorate([
603
+ state()
604
+ ], WebComponentConnector.prototype, "recommendAddress", void 0);
605
+ __decorate([
606
+ state()
607
+ ], WebComponentConnector.prototype, "internalAddress", void 0);
608
+ __decorate([
609
+ state()
610
+ ], WebComponentConnector.prototype, "balance", void 0);
420
611
  WebComponentConnector = __decorate([
421
612
  customElement("ccc-connector")
422
613
  ], WebComponentConnector);
@@ -0,0 +1,4 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ export declare function formatString(str: string | undefined, l?: number, r?: number): string | undefined;
3
+ export declare function generateConnectedScene(wallet: ccc.Wallet, signer: ccc.SignerInfo, recommendedAddress: string | undefined, internalAddress: string | undefined, balance: ccc.Num | undefined, disconnect: () => void, handleSwitchClick: () => void): (import("lit").TemplateResult<1> | undefined)[];
4
+ //# sourceMappingURL=connected.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connected.d.ts","sourceRoot":"","sources":["../../src/scenes/connected.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAgBnC,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,CAAC,SAAI,EACL,CAAC,SAAI,GACJ,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,MAAM,EAAE,GAAG,CAAC,UAAU,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,OAAO,EAAE,GAAG,CAAC,GAAG,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM,IAAI,EACtB,iBAAiB,EAAE,MAAM,IAAI,mDAoD9B"}
@@ -0,0 +1,71 @@
1
+ import { ccc } from "@ckb-ccc/ccc";
2
+ import { html } from "lit";
3
+ import { CKB_SVG } from "../assets/chains";
4
+ import { COPY_SVG } from "../assets/copy.svg";
5
+ import { DISCONNECT_SVG } from "../assets/diconnect.svg";
6
+ import { SWAP_SVG } from "../assets/swap.svg";
7
+ import { signerTypeToIcon } from "./signers";
8
+ function copyAddress(address) {
9
+ if (!address) {
10
+ return;
11
+ }
12
+ return window.navigator.clipboard.writeText(address);
13
+ }
14
+ export function formatString(str, l = 7, r = 5) {
15
+ if (str && str.length > l + r + 3) {
16
+ return `${str.slice(0, l)}...${str.slice(-r)}`;
17
+ }
18
+ return str;
19
+ }
20
+ export function generateConnectedScene(wallet, signer, recommendedAddress, internalAddress, balance, disconnect, handleSwitchClick) {
21
+ return [
22
+ undefined,
23
+ html `
24
+ <div class="position-relative">
25
+ <img
26
+ class="connecting-wallet-icon"
27
+ src=${wallet.icon}
28
+ alt=${wallet.name}
29
+ />
30
+ <img
31
+ class="connected-type-icon"
32
+ src=${signerTypeToIcon(signer.signer.type)}
33
+ alt=${signer.signer.type}
34
+ >
35
+ </img>
36
+ </div>
37
+
38
+ <div class="flex align-center mt-2">
39
+ <span class="text-bold fs-xl">${formatString(internalAddress)}</span>
40
+ <img class="cursor-pointer copy-btn" src=${COPY_SVG} alt="copy" @click=${() => copyAddress(internalAddress)}/>
41
+ </div>
42
+ <div class="text-bold fs-md">${ccc.fixedPointToString(balance ?? ccc.Zero)} CKB</div>
43
+ <div class="flex align-center">
44
+ <span class="text-bold text-tip fs-md">${formatString(recommendedAddress, 13, 7)}</span>
45
+ <img class="cursor-pointer copy-btn-sm" src=${COPY_SVG} alt="copy" @click=${() => copyAddress(recommendedAddress)}/>
46
+ </div>
47
+
48
+ <button
49
+ class="btn-primary mt-2"
50
+ @click=${disconnect}
51
+ >
52
+ <img
53
+ src=${DISCONNECT_SVG}
54
+ alt="disconnect"
55
+ />
56
+ Disconnect
57
+ </button>
58
+
59
+ <div class="switch-btn-container align-center flex justify-center mt-1">
60
+ <div class="switch-line"></div>
61
+ <div class="switch-content flex align-center cursor-pointer ml-2 mr-2 fs-sm" @click=${handleSwitchClick}>
62
+ <img class="mr-1 sm-chain-logo" src=${CKB_SVG} alt="Nervos Network">
63
+ ${signer.signer.client.addressPrefix === "ckb" ? "Mainnet" : "Testnet"}
64
+ ${["ckb", "ckt"].includes(signer.signer.client.addressPrefix) ? "" : ` ${signer.signer.client.addressPrefix}`}
65
+ <img class="ml-1" src=${SWAP_SVG} alt="Nervos Network">
66
+ </div>
67
+ <div class="switch-line"></div>
68
+ </div>
69
+ `,
70
+ ];
71
+ }
@@ -0,0 +1,3 @@
1
+ import { ccc } from "..";
2
+ export declare function generateNetworksScene(client: ccc.Client, handleSwapClick: (client: ccc.Client) => unknown): unknown[];
3
+ //# sourceMappingURL=networks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../src/scenes/networks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AAGzB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,GAAG,CAAC,MAAM,EAClB,eAAe,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,OAAO,aAuCjD"}