@mysten/enoki-connect 0.0.26 → 0.1.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.
@@ -0,0 +1,251 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
5
+ };
6
+ var __decorateClass = (decorators, target, key, kind) => {
7
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
8
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
+ if (decorator = decorators[i])
10
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
+ if (kind && result) __defProp(target, key, result);
12
+ return result;
13
+ };
14
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
15
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
16
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
17
+ var _EnokiConnectModal_instances, handleContinue_fn;
18
+ import { css, html } from "lit";
19
+ import { customElement, property } from "lit/decorators.js";
20
+ import { BaseModal } from "./base-modal.js";
21
+ let EnokiConnectModal = class extends BaseModal {
22
+ constructor() {
23
+ super(...arguments);
24
+ __privateAdd(this, _EnokiConnectModal_instances);
25
+ this.walletName = "";
26
+ this.dappName = "";
27
+ }
28
+ render() {
29
+ return html`<dialog
30
+ @click=${this.handleDialogClick}
31
+ @cancel=${this.handleCancel}
32
+ class="modal${this._isClosing ? " closing" : ""}"
33
+ @animationend=${this.handleAnimationEnd}
34
+ >
35
+ <div class="content" @click=${this.handleContentClick}>
36
+ <button
37
+ class="close"
38
+ @click=${this.handleCancel}
39
+ ?disabled=${this.disabled || this._isClosing}
40
+ >
41
+ <svg
42
+ xmlns="http://www.w3.org/2000/svg"
43
+ viewBox="0 0 24 24"
44
+ fill="none"
45
+ stroke="currentColor"
46
+ stroke-width="2"
47
+ stroke-linecap="round"
48
+ stroke-linejoin="round"
49
+ class="lucide lucide-x"
50
+ >
51
+ <path d="M18 6 6 18" />
52
+ <path d="m6 6 12 12" />
53
+ </svg>
54
+ </button>
55
+ <h1 class="title capitalize">${this.walletName} Operation Request</h1>
56
+ <p class="description">
57
+ <span class="capitalize bold">${this.dappName}</span> requested a wallet operation. Click
58
+ continue to open <span class="wallet-name bold">${this.walletName}</span> (in a new tab)
59
+ and review the request.
60
+ </p>
61
+ <div class="footer">
62
+ <button
63
+ class="btn secondary"
64
+ @click=${this.handleCancel}
65
+ ?disabled=${this.disabled || this._isClosing}
66
+ >
67
+ Cancel
68
+ </button>
69
+ <button
70
+ class="btn primary"
71
+ @click=${__privateMethod(this, _EnokiConnectModal_instances, handleContinue_fn)}
72
+ ?disabled=${this.disabled || this._isClosing}
73
+ >
74
+ Continue
75
+ </button>
76
+ </div>
77
+ </div>
78
+ </dialog>`;
79
+ }
80
+ };
81
+ _EnokiConnectModal_instances = new WeakSet();
82
+ handleContinue_fn = function() {
83
+ this.dispatchEvent(new CustomEvent("approved"));
84
+ };
85
+ EnokiConnectModal.styles = css`
86
+ :host {
87
+ --modal-font-family: var(
88
+ --font-family,
89
+ ui-sans-serif,
90
+ system-ui,
91
+ -apple-system,
92
+ BlinkMacSystemFont,
93
+ 'Segoe UI',
94
+ Roboto,
95
+ 'Helvetica Neue',
96
+ Arial,
97
+ 'Noto Sans',
98
+ sans-serif,
99
+ 'Apple Color Emoji',
100
+ 'Segoe UI Emoji',
101
+ 'Segoe UI Symbol',
102
+ 'Noto Color Emoji'
103
+ );
104
+ --modal-radius: var(--radius, 0.625rem);
105
+ --modal-background: var(--popover, oklch(1 0 0));
106
+ --modal-foreground: var(--popover-foreground, oklch(0.145 0 0));
107
+ --modal-backdrop: oklch(from var(--modal-background) l c h / 0.4);
108
+ --modal-box-shadow: 0 1px 10px oklch(from var(--modal-foreground) l c h / 0.01);
109
+ --modal-primary: var(--primary, oklch(0.205 0 0));
110
+ --modal-primary-foreground: var(--primary-foreground, oklch(0.985 0 0));
111
+ --modal-primary-hover: color-mix(in oklch, var(--modal-primary) 85%, white);
112
+ --modal-secondary: var(--secondary, oklch(0.97 0 0));
113
+ --modal-secondary-foreground: var(--secondary-foreground, oklch(0.205 0 0));
114
+ --modal-secondary-hover: color-mix(in oklch, var(--modal-secondary) 85%, white);
115
+ --modal-muted-foreground: var(--muted-foreground, oklch(0.556 0 0));
116
+ --modal-accent: var(--accent, oklch(0.97 0 0));
117
+ --modal-accent-foreground: var(--accent-foreground, oklch(0.205 0 0));
118
+ }
119
+ .modal {
120
+ color: var(--modal-foreground);
121
+ border: none;
122
+ animation: fadeIn 250ms ease-in-out forwards;
123
+ max-width: 320px;
124
+ background-color: var(--modal-background);
125
+ border-radius: var(--modal-radius);
126
+ box-shadow: var(--modal-box-shadow);
127
+ padding: 0;
128
+ font-family: var(--modal-font-family);
129
+ }
130
+ .modal::backdrop {
131
+ background-color: var(--modal-backdrop);
132
+ }
133
+ .content {
134
+ padding: 20px;
135
+ display: flex;
136
+ flex-direction: column;
137
+ gap: 10px;
138
+ }
139
+ .capitalize {
140
+ text-transform: capitalize;
141
+ }
142
+ .bold {
143
+ font-weight: 800;
144
+ }
145
+ .title {
146
+ font-size: 16px;
147
+ font-weight: 600;
148
+ line-height: 1.5;
149
+ color: var(--modal-foreground);
150
+ margin: 0;
151
+ }
152
+ .description {
153
+ font-size: 14px;
154
+ line-height: 1.5;
155
+ color: var(--modal-muted-foreground);
156
+ margin: 0;
157
+ }
158
+ .footer {
159
+ display: flex;
160
+ justify-content: flex-end;
161
+ align-items: center;
162
+ gap: 10px;
163
+ }
164
+ .btn {
165
+ border: none;
166
+ border-radius: 6px;
167
+ padding: 8px 14px;
168
+ cursor: pointer;
169
+ transition: background 0.2s;
170
+ font-size: 13px;
171
+ font-weight: 600;
172
+ }
173
+ .btn.primary {
174
+ background: var(--modal-primary);
175
+ color: var(--modal-primary-foreground);
176
+ }
177
+ .btn.primary:hover,
178
+ .btn.primary:focus,
179
+ .btn.primary:active {
180
+ background: var(--modal-primary-hover);
181
+ }
182
+ .btn.secondary {
183
+ background: var(--modal-secondary);
184
+ color: var(--modal-secondary-foreground);
185
+ }
186
+ .btn.secondary:hover,
187
+ .btn.secondary:focus,
188
+ .btn.secondary:active {
189
+ background: var(--modal-secondary-hover);
190
+ }
191
+ button:disabled {
192
+ opacity: 0.5;
193
+ cursor: default;
194
+ }
195
+ .close {
196
+ all: unset;
197
+ position: absolute;
198
+ top: 5px;
199
+ right: 5px;
200
+ background: transparent;
201
+ color: var(--modal-muted-foreground);
202
+ border: none;
203
+ cursor: pointer;
204
+ width: 18px;
205
+ height: 18px;
206
+ border-radius: var(--modal-radius);
207
+ padding: 3px;
208
+ transition: background 0.2s;
209
+ }
210
+ .close:hover,
211
+ .close:focus,
212
+ .close:active {
213
+ background: var(--modal-accent);
214
+ color: var(--modal-accent-foreground);
215
+ }
216
+ .modal.closing {
217
+ animation: fadeOut 250ms ease-in-out forwards;
218
+ }
219
+
220
+ @keyframes fadeIn {
221
+ from {
222
+ transform: translateY(-20px) scale(0.8);
223
+ opacity: 0;
224
+ }
225
+ to {
226
+ opacity: 1;
227
+ }
228
+ }
229
+ @keyframes fadeOut {
230
+ from {
231
+ opacity: 1;
232
+ }
233
+ to {
234
+ transform: translateY(20px) scale(0.8);
235
+ opacity: 0;
236
+ }
237
+ }
238
+ `;
239
+ __decorateClass([
240
+ property()
241
+ ], EnokiConnectModal.prototype, "walletName", 2);
242
+ __decorateClass([
243
+ property()
244
+ ], EnokiConnectModal.prototype, "dappName", 2);
245
+ EnokiConnectModal = __decorateClass([
246
+ customElement("enoki-connect-modal")
247
+ ], EnokiConnectModal);
248
+ export {
249
+ EnokiConnectModal
250
+ };
251
+ //# sourceMappingURL=modal.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/modal.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nimport { css, html } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { BaseModal } from './base-modal.js';\n\n/**\n * A modal component for displaying wallet operation request fallback UI.\n *\n * @element enoki-connect-modal\n *\n * @prop {string} walletName - The name of the wallet.\n * @prop {string} dappName - The name of the dapp.\n * @prop {boolean} disabled - Whether the modal is disabled.\n * @prop {boolean} open - Whether the modal is open.\n *\n */\n@customElement('enoki-connect-modal')\nexport class EnokiConnectModal extends BaseModal {\n\tstatic styles = css`\n\t\t:host {\n\t\t\t--modal-font-family: var(\n\t\t\t\t--font-family,\n\t\t\t\tui-sans-serif,\n\t\t\t\tsystem-ui,\n\t\t\t\t-apple-system,\n\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t'Segoe UI',\n\t\t\t\tRoboto,\n\t\t\t\t'Helvetica Neue',\n\t\t\t\tArial,\n\t\t\t\t'Noto Sans',\n\t\t\t\tsans-serif,\n\t\t\t\t'Apple Color Emoji',\n\t\t\t\t'Segoe UI Emoji',\n\t\t\t\t'Segoe UI Symbol',\n\t\t\t\t'Noto Color Emoji'\n\t\t\t);\n\t\t\t--modal-radius: var(--radius, 0.625rem);\n\t\t\t--modal-background: var(--popover, oklch(1 0 0));\n\t\t\t--modal-foreground: var(--popover-foreground, oklch(0.145 0 0));\n\t\t\t--modal-backdrop: oklch(from var(--modal-background) l c h / 0.4);\n\t\t\t--modal-box-shadow: 0 1px 10px oklch(from var(--modal-foreground) l c h / 0.01);\n\t\t\t--modal-primary: var(--primary, oklch(0.205 0 0));\n\t\t\t--modal-primary-foreground: var(--primary-foreground, oklch(0.985 0 0));\n\t\t\t--modal-primary-hover: color-mix(in oklch, var(--modal-primary) 85%, white);\n\t\t\t--modal-secondary: var(--secondary, oklch(0.97 0 0));\n\t\t\t--modal-secondary-foreground: var(--secondary-foreground, oklch(0.205 0 0));\n\t\t\t--modal-secondary-hover: color-mix(in oklch, var(--modal-secondary) 85%, white);\n\t\t\t--modal-muted-foreground: var(--muted-foreground, oklch(0.556 0 0));\n\t\t\t--modal-accent: var(--accent, oklch(0.97 0 0));\n\t\t\t--modal-accent-foreground: var(--accent-foreground, oklch(0.205 0 0));\n\t\t}\n\t\t.modal {\n\t\t\tcolor: var(--modal-foreground);\n\t\t\tborder: none;\n\t\t\tanimation: fadeIn 250ms ease-in-out forwards;\n\t\t\tmax-width: 320px;\n\t\t\tbackground-color: var(--modal-background);\n\t\t\tborder-radius: var(--modal-radius);\n\t\t\tbox-shadow: var(--modal-box-shadow);\n\t\t\tpadding: 0;\n\t\t\tfont-family: var(--modal-font-family);\n\t\t}\n\t\t.modal::backdrop {\n\t\t\tbackground-color: var(--modal-backdrop);\n\t\t}\n\t\t.content {\n\t\t\tpadding: 20px;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 10px;\n\t\t}\n\t\t.capitalize {\n\t\t\ttext-transform: capitalize;\n\t\t}\n\t\t.bold {\n\t\t\tfont-weight: 800;\n\t\t}\n\t\t.title {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: 600;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: var(--modal-foreground);\n\t\t\tmargin: 0;\n\t\t}\n\t\t.description {\n\t\t\tfont-size: 14px;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: var(--modal-muted-foreground);\n\t\t\tmargin: 0;\n\t\t}\n\t\t.footer {\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: flex-end;\n\t\t\talign-items: center;\n\t\t\tgap: 10px;\n\t\t}\n\t\t.btn {\n\t\t\tborder: none;\n\t\t\tborder-radius: 6px;\n\t\t\tpadding: 8px 14px;\n\t\t\tcursor: pointer;\n\t\t\ttransition: background 0.2s;\n\t\t\tfont-size: 13px;\n\t\t\tfont-weight: 600;\n\t\t}\n\t\t.btn.primary {\n\t\t\tbackground: var(--modal-primary);\n\t\t\tcolor: var(--modal-primary-foreground);\n\t\t}\n\t\t.btn.primary:hover,\n\t\t.btn.primary:focus,\n\t\t.btn.primary:active {\n\t\t\tbackground: var(--modal-primary-hover);\n\t\t}\n\t\t.btn.secondary {\n\t\t\tbackground: var(--modal-secondary);\n\t\t\tcolor: var(--modal-secondary-foreground);\n\t\t}\n\t\t.btn.secondary:hover,\n\t\t.btn.secondary:focus,\n\t\t.btn.secondary:active {\n\t\t\tbackground: var(--modal-secondary-hover);\n\t\t}\n\t\tbutton:disabled {\n\t\t\topacity: 0.5;\n\t\t\tcursor: default;\n\t\t}\n\t\t.close {\n\t\t\tall: unset;\n\t\t\tposition: absolute;\n\t\t\ttop: 5px;\n\t\t\tright: 5px;\n\t\t\tbackground: transparent;\n\t\t\tcolor: var(--modal-muted-foreground);\n\t\t\tborder: none;\n\t\t\tcursor: pointer;\n\t\t\twidth: 18px;\n\t\t\theight: 18px;\n\t\t\tborder-radius: var(--modal-radius);\n\t\t\tpadding: 3px;\n\t\t\ttransition: background 0.2s;\n\t\t}\n\t\t.close:hover,\n\t\t.close:focus,\n\t\t.close:active {\n\t\t\tbackground: var(--modal-accent);\n\t\t\tcolor: var(--modal-accent-foreground);\n\t\t}\n\t\t.modal.closing {\n\t\t\tanimation: fadeOut 250ms ease-in-out forwards;\n\t\t}\n\n\t\t@keyframes fadeIn {\n\t\t\tfrom {\n\t\t\t\ttransform: translateY(-20px) scale(0.8);\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t\tto {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t}\n\t\t@keyframes fadeOut {\n\t\t\tfrom {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\tto {\n\t\t\t\ttransform: translateY(20px) scale(0.8);\n\t\t\t\topacity: 0;\n\t\t\t}\n\t\t}\n\t`;\n\n\t@property()\n\twalletName: string = '';\n\t@property()\n\tdappName: string = '';\n\n\t#handleContinue() {\n\t\tthis.dispatchEvent(new CustomEvent('approved'));\n\t}\n\n\toverride render() {\n\t\treturn html`<dialog\n\t\t\t@click=${this.handleDialogClick}\n\t\t\t@cancel=${this.handleCancel}\n\t\t\tclass=\"modal${this._isClosing ? ' closing' : ''}\"\n\t\t\t@animationend=${this.handleAnimationEnd}\n\t\t>\n\t\t\t<div class=\"content\" @click=${this.handleContentClick}>\n\t\t\t\t<button\n\t\t\t\t\tclass=\"close\"\n\t\t\t\t\t@click=${this.handleCancel}\n\t\t\t\t\t?disabled=${this.disabled || this._isClosing}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\tclass=\"lucide lucide-x\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path d=\"M18 6 6 18\" />\n\t\t\t\t\t\t<path d=\"m6 6 12 12\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<h1 class=\"title capitalize\">${this.walletName} Operation Request</h1>\n\t\t\t\t<p class=\"description\">\n\t\t\t\t\t<span class=\"capitalize bold\">${this.dappName}</span> requested a wallet operation. Click\n\t\t\t\t\tcontinue to open <span class=\"wallet-name bold\">${this.walletName}</span> (in a new tab)\n\t\t\t\t\tand review the request.\n\t\t\t\t</p>\n\t\t\t\t<div class=\"footer\">\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn secondary\"\n\t\t\t\t\t\t@click=${this.handleCancel}\n\t\t\t\t\t\t?disabled=${this.disabled || this._isClosing}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn primary\"\n\t\t\t\t\t\t@click=${this.#handleContinue}\n\t\t\t\t\t\t?disabled=${this.disabled || this._isClosing}\n\t\t\t\t\t>\n\t\t\t\t\t\tContinue\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</dialog>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'enoki-connect-modal': EnokiConnectModal;\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;AAEA,SAAS,KAAK,YAAY;AAC1B,SAAS,eAAe,gBAAgB;AACxC,SAAS,iBAAiB;AAcnB,IAAM,oBAAN,cAAgC,UAAU;AAAA,EAA1C;AAAA;AAAA;AA6JN,sBAAqB;AAErB,oBAAmB;AAAA;AAAA,EAMV,SAAS;AACjB,WAAO;AAAA,YACG,KAAK,iBAAiB;AAAA,aACrB,KAAK,YAAY;AAAA,iBACb,KAAK,aAAa,aAAa,EAAE;AAAA,mBAC/B,KAAK,kBAAkB;AAAA;AAAA,iCAET,KAAK,kBAAkB;AAAA;AAAA;AAAA,cAG1C,KAAK,YAAY;AAAA,iBACd,KAAK,YAAY,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAgBd,KAAK,UAAU;AAAA;AAAA,qCAEb,KAAK,QAAQ;AAAA,uDACK,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMvD,KAAK,YAAY;AAAA,kBACd,KAAK,YAAY,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAMnC,sBAAK,gDAAe;AAAA,kBACjB,KAAK,YAAY,KAAK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjD;AACD;AAzNO;AAiKN,oBAAe,WAAG;AACjB,OAAK,cAAc,IAAI,YAAY,UAAU,CAAC;AAC/C;AAnKY,kBACL,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4JhB;AAAA,EADC,SAAS;AAAA,GA5JE,kBA6JZ;AAEA;AAAA,EADC,SAAS;AAAA,GA9JE,kBA+JZ;AA/JY,oBAAN;AAAA,EADN,cAAc,qBAAqB;AAAA,GACvB;",
6
+ "names": []
7
+ }
@@ -1,5 +1,4 @@
1
1
  {
2
2
  "private": true,
3
- "type": "module",
4
- "sideEffects": false
3
+ "type": "module"
5
4
  }
@@ -1,5 +1,6 @@
1
1
  import type { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature, SuiSignAndExecuteTransactionFeature, SuiSignPersonalMessageFeature, SuiSignTransactionBlockFeature, SuiSignTransactionFeature, Wallet, WalletIcon } from '@mysten/wallet-standard';
2
2
  import { ReadonlyWalletAccount } from '@mysten/wallet-standard';
3
+ import '../components/modal.js';
3
4
  export type SupportedNetwork = 'mainnet' | 'testnet' | 'devnet';
4
5
  export declare class EnokiConnectWallet implements Wallet {
5
6
  #private;
@@ -17,6 +17,8 @@ import {
17
17
  } from "@mysten/wallet-standard";
18
18
  import mitt from "mitt";
19
19
  import { DappPostMessageChannel, decodeJwtSession } from "@mysten/window-wallet-core";
20
+ import { promiseWithResolvers } from "@mysten/utils";
21
+ import "../components/modal.js";
20
22
  const SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN, SUI_DEVNET_CHAIN];
21
23
  const ACCOUNT_FEATURES = [
22
24
  "sui:signTransaction",
@@ -48,7 +50,7 @@ class EnokiConnectWallet {
48
50
  account,
49
51
  chain
50
52
  }) => {
51
- const popup = __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
53
+ const popup = await __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
52
54
  const response = await popup.send({
53
55
  type: "sign-transaction",
54
56
  chain,
@@ -62,7 +64,7 @@ class EnokiConnectWallet {
62
64
  };
63
65
  });
64
66
  __privateAdd(this, _signTransaction, async ({ transaction, account, chain }) => {
65
- const popup = __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
67
+ const popup = await __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
66
68
  const response = await popup.send({
67
69
  type: "sign-transaction",
68
70
  chain,
@@ -80,7 +82,7 @@ class EnokiConnectWallet {
80
82
  account,
81
83
  chain
82
84
  }) => {
83
- const popup = __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
85
+ const popup = await __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
84
86
  const response = await popup.send({
85
87
  type: "sign-and-execute-transaction",
86
88
  transaction: await transaction.toJSON(),
@@ -96,7 +98,7 @@ class EnokiConnectWallet {
96
98
  };
97
99
  });
98
100
  __privateAdd(this, _signPersonalMessage, async ({ message, account, chain }) => {
99
- const popup = __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
101
+ const popup = await __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
100
102
  const response = await popup.send({
101
103
  type: "sign-personal-message",
102
104
  chain: chain ?? __privateGet(this, _defaultChain),
@@ -124,7 +126,7 @@ class EnokiConnectWallet {
124
126
  }
125
127
  return { accounts: this.accounts };
126
128
  }
127
- const popup = __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
129
+ const popup = await __privateMethod(this, _EnokiConnectWallet_instances, getNewPopupChannel_fn).call(this);
128
130
  const response = await popup.send({
129
131
  type: "connect"
130
132
  });
@@ -228,13 +230,21 @@ getStoredSession_fn = function() {
228
230
  }
229
231
  return session;
230
232
  };
231
- getNewPopupChannel_fn = function() {
233
+ getNewPopupChannel_fn = async function() {
234
+ let popupWindow = window.open("about:blank", "_blank");
235
+ if (!popupWindow) {
236
+ popupWindow = await addClickToOpenPopupWindow({
237
+ walletName: __privateGet(this, _walletName),
238
+ dappName: __privateGet(this, _dappName)
239
+ });
240
+ }
232
241
  return new DappPostMessageChannel({
233
242
  appName: __privateGet(this, _dappName),
234
243
  hostOrigin: __privateGet(this, _hostOrigin),
235
244
  extraRequestOptions: {
236
245
  publicAppSlug: __privateGet(this, _publicAppSlug)
237
- }
246
+ },
247
+ popupWindow
238
248
  });
239
249
  };
240
250
  getAccountsFromSession_fn = function(session) {
@@ -254,6 +264,35 @@ getAccountsFromSession_fn = function(session) {
254
264
  return [];
255
265
  }
256
266
  };
267
+ function addClickToOpenPopupWindow({
268
+ walletName,
269
+ dappName
270
+ }) {
271
+ const { promise, resolve, reject } = promiseWithResolvers();
272
+ const modal = document.createElement("enoki-connect-modal");
273
+ modal.walletName = walletName;
274
+ modal.dappName = dappName;
275
+ modal.open = true;
276
+ modal.addEventListener("cancel", () => {
277
+ reject(new Error("Popup was blocked from browser and user rejected click to review request"));
278
+ modal.open = false;
279
+ });
280
+ modal.addEventListener("approved", () => {
281
+ modal.disabled = true;
282
+ modal.open = false;
283
+ const popup = window.open("about:blank", "_blank");
284
+ if (popup) {
285
+ resolve(popup);
286
+ } else {
287
+ reject(new Error("Failed to open popup"));
288
+ }
289
+ });
290
+ modal.addEventListener("closed", () => {
291
+ modal.remove();
292
+ });
293
+ document.body.appendChild(modal);
294
+ return promise;
295
+ }
257
296
  async function getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl) {
258
297
  const sortedPublicAppSlugs = [...publicAppSlugs].sort();
259
298
  const queryParams = new URLSearchParams();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/wallet/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_DEVNET_CHAIN,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet' | 'devnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN, SUI_DEVNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\t#getNewPopupChannel() {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\ntype EnokiConnectMetadata = {\n\tpublicAppSlug: string;\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlugs: string[], enokiApiUrl: string) {\n\tconst sortedPublicAppSlugs = [...publicAppSlugs].sort();\n\tconst queryParams = new URLSearchParams();\n\n\tfor (const publicAppSlug of sortedPublicAppSlugs) {\n\t\tqueryParams.append('slugs', publicAppSlug);\n\t}\n\n\tqueryParams.sort();\n\n\tconst res = await fetch(new URL(`/v1/connect/metadata?${queryParams.toString()}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata[];\n}\n\n/**\n * Registers Enoki Connect wallets for your dApp.\n *\n * This function fetches wallet metadata for the provided public app slugs and registers\n * them with the wallet standard. It returns the registered wallet instances and an\n * `unregister` function to remove them if needed.\n *\n * @param publicAppSlugs - An array of public app slugs to register. You can obtain these slugs from the wallet developer.\n * @param dappName - The display name of your dApp. This will be shown to users in wallet UIs.\n * @param network - (Optional) The default Sui network to use for wallet operations (when chain is not specified in the wallet method). Accepts 'mainnet', 'testnet', or 'devnet'. Defaults to 'mainnet' if not specified.\n * @param enokiApiUrl - (Optional) The Enoki API endpoint to use for fetching wallet metadata. Defaults to the public Enoki API at 'https://api.enoki.mystenlabs.com'. (Override this if you are running a local or custom Enoki API instance.)\n *\n * @returns An object containing:\n * - `wallets`: The array of registered EnokiConnectWallet instances.\n * - `unregister`: A function to unregister all registered wallets.\n *\n * @example\n * ```ts\n * const { wallets, unregister } = await registerEnokiConnectWallets({\n * publicAppSlugs: ['an-app-slug'],\n * dappName: 'My Dapp',\n * });\n * ```\n */\nexport async function registerEnokiConnectWallets({\n\tpublicAppSlugs,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlugs: string[];\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst wallets = getWallets();\n\tconst data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);\n\tconst unregisterCallbacks: (() => void)[] = [];\n\tconst registeredWallets: EnokiConnectWallet[] = [];\n\n\tfor (const aWalletMetadata of data) {\n\t\tconst wallet = new EnokiConnectWallet({\n\t\t\twalletName: aWalletMetadata.name,\n\t\t\tdappName,\n\t\t\thostOrigin: aWalletMetadata.appUrl,\n\t\t\ticon: aWalletMetadata.logoUrl,\n\t\t\tnetwork,\n\t\t\tpublicAppSlug: aWalletMetadata.publicAppSlug,\n\t\t});\n\t\tconst unregister = wallets.register(wallet);\n\n\t\tunregisterCallbacks.push(unregister);\n\t\tregisteredWallets.push(wallet);\n\t}\n\n\treturn {\n\t\twallets: registeredWallets,\n\t\tunregister: () => {\n\t\t\tfor (const unregister of unregisterCallbacks) {\n\t\t\t\tunregister();\n\t\t\t}\n\t\t},\n\t};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport type {\n\tIdentifierString,\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsListeners,\n\tStandardEventsOnMethod,\n\tSuiSignAndExecuteTransactionFeature,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageFeature,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionBlockFeature,\n\tSuiSignTransactionBlockMethod,\n\tSuiSignTransactionFeature,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport {\n\tgetWallets,\n\tReadonlyWalletAccount,\n\tSUI_DEVNET_CHAIN,\n\tSUI_MAINNET_CHAIN,\n\tSUI_TESTNET_CHAIN,\n} from '@mysten/wallet-standard';\nimport type { Emitter } from 'mitt';\nimport mitt from 'mitt';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\nimport { promiseWithResolvers } from '@mysten/utils';\n\nimport '../components/modal.js';\n\nexport type SupportedNetwork = 'mainnet' | 'testnet' | 'devnet';\n\ntype WalletEventsMap = {\n\t[E in keyof StandardEventsListeners]: Parameters<StandardEventsListeners[E]>[0];\n};\n\nconst SUPPORTED_CHAINS = [SUI_MAINNET_CHAIN, SUI_TESTNET_CHAIN, SUI_DEVNET_CHAIN] as const;\nconst ACCOUNT_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n\t'sui:signTransactionBlock',\n\t'sui:signAndExecuteTransactionBlock',\n] as const;\n\nexport class EnokiConnectWallet implements Wallet {\n\treadonly id: string;\n\t#events: Emitter<WalletEventsMap>;\n\t#accounts: ReadonlyWalletAccount[];\n\t#hostOrigin: string;\n\t#walletName: string;\n\t#dappName: string;\n\t#icon: WalletIcon;\n\t#defaultChain: IdentifierString;\n\t#publicAppSlug: string;\n\n\tget name() {\n\t\treturn this.#walletName;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget chains() {\n\t\treturn SUPPORTED_CHAINS;\n\t}\n\n\tget accounts() {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardDisconnectFeature &\n\t\tStandardEventsFeature &\n\t\tSuiSignTransactionBlockFeature &\n\t\tSuiSignTransactionFeature &\n\t\tSuiSignPersonalMessageFeature &\n\t\tSuiSignAndExecuteTransactionFeature {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'sui:signTransactionBlock': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tsignTransactionBlock: this.#signTransactionBlock,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\tconstructor({\n\t\tpublicAppSlug,\n\t\twalletName,\n\t\tdappName,\n\t\thostOrigin,\n\t\ticon,\n\t\tnetwork,\n\t}: {\n\t\tpublicAppSlug: string;\n\t\twalletName: string;\n\t\tdappName: string;\n\t\tnetwork: SupportedNetwork;\n\t\thostOrigin: string;\n\t\ticon: WalletIcon;\n\t}) {\n\t\tthis.#accounts = [];\n\t\tthis.#events = mitt();\n\t\tthis.#hostOrigin = hostOrigin;\n\t\tthis.#walletName = walletName;\n\t\tthis.#dappName = dappName;\n\t\tthis.#icon = icon;\n\t\tthis.#defaultChain = `sui:${network}`;\n\t\tthis.#publicAppSlug = publicAppSlug;\n\t\tthis.id = `enoki-connect-${publicAppSlug}`;\n\t}\n\n\t#signTransactionBlock: SuiSignTransactionBlockMethod = async ({\n\t\ttransactionBlock,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = await this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transactionBlock.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\ttransactionBlockBytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async ({ transaction, account, chain }) => {\n\t\tconst popup = await this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\tchain,\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async ({\n\t\ttransaction,\n\t\taccount,\n\t\tchain,\n\t}) => {\n\t\tconst popup = await this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: await transaction.toJSON(),\n\t\t\taddress: account.address,\n\t\t\tchain,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async ({ message, account, chain }) => {\n\t\tconst popup = await this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tchain: chain ?? this.#defaultChain,\n\t\t\tmessage: toBase64(message),\n\t\t\taddress: account.address,\n\t\t\tsession: this.#getStoredSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t};\n\t};\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#setAccounts(session?: string) {\n\t\tif (session) {\n\t\t\tthis.#accounts = this.#getAccountsFromSession(session);\n\t\t\tlocalStorage.setItem(this.#getSessionKey(), session);\n\t\t} else {\n\t\t\tthis.#accounts = [];\n\t\t}\n\n\t\tthis.#events.emit('change', { accounts: this.accounts });\n\t}\n\n\t#connect: StandardConnectMethod = async (input) => {\n\t\tif (input?.silent) {\n\t\t\ttry {\n\t\t\t\tconst session = this.#getStoredSession();\n\n\t\t\t\tif (session) {\n\t\t\t\t\tthis.#setAccounts(session);\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\t// ignore\n\t\t\t}\n\n\t\t\treturn { accounts: this.accounts };\n\t\t}\n\n\t\tconst popup = await this.#getNewPopupChannel();\n\t\tconst response = await popup.send({\n\t\t\ttype: 'connect',\n\t\t});\n\n\t\tthis.#setAccounts(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tlocalStorage.removeItem(this.#getSessionKey());\n\t\tthis.#setAccounts();\n\t};\n\n\t#getSessionKey() {\n\t\treturn `enoki-connect-${this.#publicAppSlug}:session`;\n\t}\n\n\t#getStoredSession() {\n\t\tconst session = localStorage.getItem(this.#getSessionKey());\n\n\t\tif (!session) {\n\t\t\tthrow new Error('No session found');\n\t\t}\n\n\t\treturn session;\n\t}\n\n\tasync #getNewPopupChannel() {\n\t\tlet popupWindow: Window | undefined | null = window.open('about:blank', '_blank');\n\n\t\tif (!popupWindow) {\n\t\t\tpopupWindow = await addClickToOpenPopupWindow({\n\t\t\t\twalletName: this.#walletName,\n\t\t\t\tdappName: this.#dappName,\n\t\t\t});\n\t\t}\n\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#dappName,\n\t\t\thostOrigin: this.#hostOrigin,\n\t\t\textraRequestOptions: {\n\t\t\t\tpublicAppSlug: this.#publicAppSlug,\n\t\t\t},\n\t\t\tpopupWindow,\n\t\t});\n\t}\n\n\t#getAccountsFromSession(session: string) {\n\t\ttry {\n\t\t\tconst {\n\t\t\t\tpayload: { accounts },\n\t\t\t} = decodeJwtSession(session);\n\n\t\t\treturn accounts.map(\n\t\t\t\t(anAccount) =>\n\t\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\t\taddress: anAccount.address,\n\t\t\t\t\t\tchains: SUPPORTED_CHAINS,\n\t\t\t\t\t\tfeatures: ACCOUNT_FEATURES,\n\t\t\t\t\t\tpublicKey: fromBase64(anAccount.publicKey),\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\nfunction addClickToOpenPopupWindow({\n\twalletName,\n\tdappName,\n}: {\n\twalletName: string;\n\tdappName: string;\n}) {\n\tconst { promise, resolve, reject } = promiseWithResolvers<Window>();\n\tconst modal = document.createElement('enoki-connect-modal');\n\n\tmodal.walletName = walletName;\n\tmodal.dappName = dappName;\n\tmodal.open = true;\n\n\tmodal.addEventListener('cancel', () => {\n\t\treject(new Error('Popup was blocked from browser and user rejected click to review request'));\n\t\tmodal.open = false;\n\t});\n\n\tmodal.addEventListener('approved', () => {\n\t\tmodal.disabled = true;\n\t\tmodal.open = false;\n\n\t\tconst popup = window.open('about:blank', '_blank');\n\n\t\tif (popup) {\n\t\t\tresolve(popup);\n\t\t} else {\n\t\t\treject(new Error('Failed to open popup'));\n\t\t}\n\t});\n\n\tmodal.addEventListener('closed', () => {\n\t\tmodal.remove();\n\t});\n\n\tdocument.body.appendChild(modal);\n\n\treturn promise;\n}\n\ntype EnokiConnectMetadata = {\n\tpublicAppSlug: string;\n\tname: string;\n\tlogoUrl: WalletIcon;\n\tappUrl: string;\n};\n\nasync function getEnokiConnectMetadata(publicAppSlugs: string[], enokiApiUrl: string) {\n\tconst sortedPublicAppSlugs = [...publicAppSlugs].sort();\n\tconst queryParams = new URLSearchParams();\n\n\tfor (const publicAppSlug of sortedPublicAppSlugs) {\n\t\tqueryParams.append('slugs', publicAppSlug);\n\t}\n\n\tqueryParams.sort();\n\n\tconst res = await fetch(new URL(`/v1/connect/metadata?${queryParams.toString()}`, enokiApiUrl));\n\n\tif (!res.ok) {\n\t\tthrow new Error('Failed to fetch enoki connect metadata');\n\t}\n\n\tconst { data } = await res.json();\n\n\treturn data as EnokiConnectMetadata[];\n}\n\n/**\n * Registers Enoki Connect wallets for your dApp.\n *\n * This function fetches wallet metadata for the provided public app slugs and registers\n * them with the wallet standard. It returns the registered wallet instances and an\n * `unregister` function to remove them if needed.\n *\n * @param publicAppSlugs - An array of public app slugs to register. You can obtain these slugs from the wallet developer.\n * @param dappName - The display name of your dApp. This will be shown to users in wallet UIs.\n * @param network - (Optional) The default Sui network to use for wallet operations (when chain is not specified in the wallet method). Accepts 'mainnet', 'testnet', or 'devnet'. Defaults to 'mainnet' if not specified.\n * @param enokiApiUrl - (Optional) The Enoki API endpoint to use for fetching wallet metadata. Defaults to the public Enoki API at 'https://api.enoki.mystenlabs.com'. (Override this if you are running a local or custom Enoki API instance.)\n *\n * @returns An object containing:\n * - `wallets`: The array of registered EnokiConnectWallet instances.\n * - `unregister`: A function to unregister all registered wallets.\n *\n * @example\n * ```ts\n * const { wallets, unregister } = await registerEnokiConnectWallets({\n * publicAppSlugs: ['an-app-slug'],\n * dappName: 'My Dapp',\n * });\n * ```\n */\nexport async function registerEnokiConnectWallets({\n\tpublicAppSlugs,\n\tdappName,\n\tnetwork = 'mainnet',\n\tenokiApiUrl = 'https://api.enoki.mystenlabs.com',\n}: {\n\tpublicAppSlugs: string[];\n\tdappName: string;\n\tnetwork?: SupportedNetwork;\n\tenokiApiUrl?: string;\n}) {\n\tconst wallets = getWallets();\n\tconst data = await getEnokiConnectMetadata(publicAppSlugs, enokiApiUrl);\n\tconst unregisterCallbacks: (() => void)[] = [];\n\tconst registeredWallets: EnokiConnectWallet[] = [];\n\n\tfor (const aWalletMetadata of data) {\n\t\tconst wallet = new EnokiConnectWallet({\n\t\t\twalletName: aWalletMetadata.name,\n\t\t\tdappName,\n\t\t\thostOrigin: aWalletMetadata.appUrl,\n\t\t\ticon: aWalletMetadata.logoUrl,\n\t\t\tnetwork,\n\t\t\tpublicAppSlug: aWalletMetadata.publicAppSlug,\n\t\t});\n\t\tconst unregister = wallets.register(wallet);\n\n\t\tunregisterCallbacks.push(unregister);\n\t\tregisteredWallets.push(wallet);\n\t}\n\n\treturn {\n\t\twallets: registeredWallets,\n\t\tunregister: () => {\n\t\t\tfor (const unregister of unregisterCallbacks) {\n\t\t\t\tunregister();\n\t\t\t}\n\t\t},\n\t};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }