@mysten-incubation/dev-wallet 0.0.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +139 -0
- package/LICENSE +189 -0
- package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
- package/dist/adapters/base-adapter.mjs +6 -7
- package/dist/adapters/base-adapter.mjs.map +1 -1
- package/dist/adapters/browser.d.mts +4 -1
- package/dist/adapters/browser.mjs +4 -2
- package/dist/adapters/build-managed-account.mjs +8 -10
- package/dist/adapters/build-managed-account.mjs.map +1 -1
- package/dist/adapters/devstack-adapter.d.mts +111 -0
- package/dist/adapters/devstack-adapter.d.mts.map +1 -0
- package/dist/adapters/devstack-adapter.mjs +224 -0
- package/dist/adapters/devstack-adapter.mjs.map +1 -0
- package/dist/adapters/devstack-paths.d.mts +11 -0
- package/dist/adapters/devstack-paths.d.mts.map +1 -0
- package/dist/adapters/devstack-paths.mjs +11 -0
- package/dist/adapters/devstack-paths.mjs.map +1 -0
- package/dist/adapters/fork-relay.d.mts +109 -0
- package/dist/adapters/fork-relay.d.mts.map +1 -0
- package/dist/adapters/fork-relay.mjs +208 -0
- package/dist/adapters/fork-relay.mjs.map +1 -0
- package/dist/adapters/idb-store.mjs +12 -16
- package/dist/adapters/idb-store.mjs.map +1 -1
- package/dist/adapters/in-memory-adapter.mjs +4 -10
- package/dist/adapters/in-memory-adapter.mjs.map +1 -1
- package/dist/adapters/passkey-adapter.mjs +4 -12
- package/dist/adapters/passkey-adapter.mjs.map +1 -1
- package/dist/adapters/remote-cli-adapter.mjs +37 -72
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
- package/dist/adapters/webcrypto-adapter.mjs +2 -4
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
- package/dist/bin/cli.mjs +9 -22
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/client/dev-wallet-client.mjs +13 -28
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/index.mjs +1 -2
- package/dist/client/request-handler.mjs +36 -42
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/react/components.d.mts +9 -9
- package/dist/react/components.d.mts.map +1 -1
- package/dist/react/components.mjs +2 -5
- package/dist/react/components.mjs.map +1 -1
- package/dist/react/context.d.mts +3 -3
- package/dist/react/context.d.mts.map +1 -1
- package/dist/react/context.mjs +3 -8
- package/dist/react/context.mjs.map +1 -1
- package/dist/react/index.mjs +1 -2
- package/dist/react/useDevWallet.d.mts +3 -0
- package/dist/react/useDevWallet.d.mts.map +1 -1
- package/dist/react/useDevWallet.mjs +9 -14
- package/dist/react/useDevWallet.mjs.map +1 -1
- package/dist/server/cli-signing-middleware.mjs +7 -20
- package/dist/server/cli-signing-middleware.mjs.map +1 -1
- package/dist/server/index.mjs +1 -2
- package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
- package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
- package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
- package/dist/standalone/index.html +11 -12
- package/dist/ui/copy-controller.mjs +3 -3
- package/dist/ui/copy-controller.mjs.map +1 -1
- package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs +48 -25
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
- package/dist/ui/dev-wallet-accounts.d.mts +9 -4
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
- package/dist/ui/dev-wallet-accounts.mjs +62 -140
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
- package/dist/ui/dev-wallet-balances.d.mts +10 -3
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +241 -43
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect.d.mts +3 -3
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
- package/dist/ui/dev-wallet-connect.mjs +24 -16
- package/dist/ui/dev-wallet-connect.mjs.map +1 -1
- package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs +37 -47
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
- package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
- package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
- package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
- package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs +52 -21
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
- package/dist/ui/dev-wallet-new-account.d.mts +3 -4
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
- package/dist/ui/dev-wallet-new-account.mjs +31 -105
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
- package/dist/ui/dev-wallet-objects.d.mts +3 -3
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
- package/dist/ui/dev-wallet-objects.mjs +76 -39
- package/dist/ui/dev-wallet-objects.mjs.map +1 -1
- package/dist/ui/dev-wallet-panel.d.mts +24 -4
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +247 -64
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-popup.d.mts +3 -5
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
- package/dist/ui/dev-wallet-popup.mjs +19 -15
- package/dist/ui/dev-wallet-popup.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +3 -4
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +149 -97
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing.d.mts +9 -3
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing.mjs +119 -130
- package/dist/ui/dev-wallet-signing.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +8 -3
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +303 -38
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
- package/dist/ui/index.d.mts +3 -2
- package/dist/ui/index.mjs +2 -2
- package/dist/ui/mount.d.mts +14 -1
- package/dist/ui/mount.d.mts.map +1 -1
- package/dist/ui/mount.mjs +5 -2
- package/dist/ui/mount.mjs.map +1 -1
- package/dist/ui/styles.mjs +428 -66
- package/dist/ui/styles.mjs.map +1 -1
- package/dist/ui/transaction-analyzer.mjs +19 -30
- package/dist/ui/transaction-analyzer.mjs.map +1 -1
- package/dist/ui/utils.d.mts +59 -0
- package/dist/ui/utils.d.mts.map +1 -0
- package/dist/ui/utils.mjs +42 -15
- package/dist/ui/utils.mjs.map +1 -1
- package/dist/ui/wallet-controller.mjs +89 -20
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/constants.d.mts +9 -0
- package/dist/wallet/constants.d.mts.map +1 -0
- package/dist/wallet/constants.mjs +1 -1
- package/dist/wallet/dev-wallet.mjs +42 -99
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/initializer.d.mts +3 -0
- package/dist/wallet/initializer.d.mts.map +1 -1
- package/dist/wallet/initializer.mjs +9 -14
- package/dist/wallet/initializer.mjs.map +1 -1
- package/dist/wallet/signing.mjs +8 -21
- package/dist/wallet/signing.mjs.map +1 -1
- package/package.json +8 -6
- package/src/adapters/browser.ts +21 -0
- package/src/adapters/devstack-adapter.ts +342 -0
- package/src/adapters/devstack-paths.ts +15 -0
- package/src/adapters/fork-relay.ts +321 -0
- package/src/app/index.html +10 -11
- package/src/react/useDevWallet.ts +5 -1
- package/src/ui/dev-wallet-account-selector.ts +44 -17
- package/src/ui/dev-wallet-accounts.ts +87 -124
- package/src/ui/dev-wallet-balances.ts +248 -27
- package/src/ui/dev-wallet-connect.ts +19 -8
- package/src/ui/dev-wallet-dropdown.ts +7 -5
- package/src/ui/dev-wallet-fork-panel.ts +591 -0
- package/src/ui/dev-wallet-network-badge.ts +49 -10
- package/src/ui/dev-wallet-new-account.ts +21 -62
- package/src/ui/dev-wallet-objects.ts +59 -19
- package/src/ui/dev-wallet-panel.ts +261 -42
- package/src/ui/dev-wallet-popup.ts +12 -6
- package/src/ui/dev-wallet-settings.ts +159 -94
- package/src/ui/dev-wallet-signing-modal.ts +47 -7
- package/src/ui/dev-wallet-signing.ts +124 -97
- package/src/ui/dev-wallet-standalone.ts +310 -22
- package/src/ui/dev-wallet-tab-bar.ts +132 -70
- package/src/ui/index.ts +3 -0
- package/src/ui/mount.ts +23 -1
- package/src/ui/styles.ts +434 -58
- package/src/ui/utils.ts +66 -0
- package/src/ui/wallet-controller.ts +103 -5
- package/src/wallet/initializer.ts +7 -1
- package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { actionButtonStyles, cardItemStyles, formInputStyles, inlineErrorStyles, listContainerStyles, monoTruncateStyles, sectionHeaderStyles, sharedStyles, stateStyles, subLabelStyles } from "./styles.mjs";
|
|
2
|
+
import { formatAddress, getErrorMessage } from "./utils.mjs";
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
|
|
4
|
+
import { LitElement, css, html, nothing } from "lit";
|
|
5
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
6
|
+
//#region src/ui/dev-wallet-fork-panel.ts
|
|
7
|
+
/** Default polling cadence for `GetStatus`. Slow on purpose — the panel
|
|
8
|
+
* also refreshes after every action verb lands. */
|
|
9
|
+
const STATUS_POLL_MS = 4e3;
|
|
10
|
+
let DevWalletForkPanel = class DevWalletForkPanel extends LitElement {
|
|
11
|
+
constructor(..._args) {
|
|
12
|
+
super(..._args);
|
|
13
|
+
this.relay = null;
|
|
14
|
+
this.upstream = "";
|
|
15
|
+
this._status = null;
|
|
16
|
+
this._statusError = null;
|
|
17
|
+
this._statusLoading = false;
|
|
18
|
+
this._actionInFlight = null;
|
|
19
|
+
this._actionError = null;
|
|
20
|
+
this._slots = [];
|
|
21
|
+
this._slotsError = null;
|
|
22
|
+
this._slotToggleInFlight = null;
|
|
23
|
+
this._clockInputMs = "1000";
|
|
24
|
+
this._checkpointInputCount = "1";
|
|
25
|
+
this.#pollTimer = null;
|
|
26
|
+
this.#onClockInput = (e) => {
|
|
27
|
+
this._clockInputMs = e.target.value;
|
|
28
|
+
};
|
|
29
|
+
this.#onCheckpointInput = (e) => {
|
|
30
|
+
this._checkpointInputCount = e.target.value;
|
|
31
|
+
};
|
|
32
|
+
this.#onAdvanceClock = async () => {
|
|
33
|
+
const ms = this.#parseClock();
|
|
34
|
+
if (ms === null || !this.relay) return;
|
|
35
|
+
this._actionInFlight = "advance-clock";
|
|
36
|
+
this._actionError = null;
|
|
37
|
+
try {
|
|
38
|
+
const result = await this.relay.advanceClock(ms);
|
|
39
|
+
if (result.ok) this._status = result.value;
|
|
40
|
+
else this._actionError = result.error;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
this._actionError = getErrorMessage(error, "advance-clock failed");
|
|
43
|
+
} finally {
|
|
44
|
+
this._actionInFlight = null;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
this.#onAdvanceCheckpoint = async () => {
|
|
48
|
+
const count = this.#parseCheckpointCount();
|
|
49
|
+
if (count === null || !this.relay) return;
|
|
50
|
+
this._actionInFlight = "advance-checkpoint";
|
|
51
|
+
this._actionError = null;
|
|
52
|
+
try {
|
|
53
|
+
const result = await this.relay.advanceCheckpoint(count);
|
|
54
|
+
if (result.ok) this._status = result.value;
|
|
55
|
+
else this._actionError = result.error;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
this._actionError = getErrorMessage(error, "advance-checkpoint failed");
|
|
58
|
+
} finally {
|
|
59
|
+
this._actionInFlight = null;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
this.#onToggleSlot = async (slot) => {
|
|
63
|
+
if (!this.relay || this._slotToggleInFlight !== null) return;
|
|
64
|
+
this._slotToggleInFlight = slot.address;
|
|
65
|
+
this._slotsError = null;
|
|
66
|
+
try {
|
|
67
|
+
const result = await this.relay.setImpersonation(slot.address, !slot.active);
|
|
68
|
+
if (result.ok) {
|
|
69
|
+
this._slots = result.value;
|
|
70
|
+
this.dispatchEvent(new CustomEvent("fork-impersonation-changed", {
|
|
71
|
+
bubbles: true,
|
|
72
|
+
composed: true,
|
|
73
|
+
detail: {
|
|
74
|
+
address: slot.address,
|
|
75
|
+
active: !slot.active,
|
|
76
|
+
slots: result.value
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
} else this._slotsError = result.error;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
this._slotsError = getErrorMessage(error, "toggle failed");
|
|
82
|
+
} finally {
|
|
83
|
+
this._slotToggleInFlight = null;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
static {
|
|
88
|
+
this.styles = [
|
|
89
|
+
sharedStyles,
|
|
90
|
+
sectionHeaderStyles,
|
|
91
|
+
actionButtonStyles,
|
|
92
|
+
stateStyles,
|
|
93
|
+
cardItemStyles,
|
|
94
|
+
listContainerStyles,
|
|
95
|
+
formInputStyles,
|
|
96
|
+
inlineErrorStyles,
|
|
97
|
+
monoTruncateStyles,
|
|
98
|
+
subLabelStyles,
|
|
99
|
+
css`
|
|
100
|
+
.section {
|
|
101
|
+
margin-bottom: 18px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.section:last-child {
|
|
105
|
+
margin-bottom: 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.status-grid {
|
|
109
|
+
display: grid;
|
|
110
|
+
grid-template-columns: max-content 1fr;
|
|
111
|
+
column-gap: 12px;
|
|
112
|
+
row-gap: 6px;
|
|
113
|
+
font-size: 12px;
|
|
114
|
+
padding: 10px 12px;
|
|
115
|
+
border-radius: var(--dev-wallet-radius-md);
|
|
116
|
+
border: 1px solid var(--dev-wallet-border);
|
|
117
|
+
background: var(--dev-wallet-secondary);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.status-label {
|
|
121
|
+
font-size: 10px;
|
|
122
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
123
|
+
align-self: center;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.status-value {
|
|
127
|
+
font-family: var(--dev-wallet-font-mono);
|
|
128
|
+
color: var(--dev-wallet-foreground);
|
|
129
|
+
word-break: break-all;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.status-value.dim {
|
|
133
|
+
color: var(--dev-wallet-muted-foreground);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.action-row {
|
|
137
|
+
display: flex;
|
|
138
|
+
gap: 6px;
|
|
139
|
+
align-items: stretch;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.action-input {
|
|
143
|
+
flex: 1;
|
|
144
|
+
min-width: 0;
|
|
145
|
+
padding: 8px 10px;
|
|
146
|
+
font-size: 12px;
|
|
147
|
+
font-family: var(--dev-wallet-font-mono);
|
|
148
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
149
|
+
border: 1px solid var(--dev-wallet-border);
|
|
150
|
+
background: var(--dev-wallet-background);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.btn-action {
|
|
154
|
+
min-width: 96px;
|
|
155
|
+
padding: 0 14px;
|
|
156
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
157
|
+
font-size: 12px;
|
|
158
|
+
font-weight: var(--dev-wallet-font-weight-semibold);
|
|
159
|
+
background: var(--dev-wallet-primary);
|
|
160
|
+
color: var(--dev-wallet-primary-foreground);
|
|
161
|
+
transition: background-color 0.15s;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.btn-action:hover:not(:disabled) {
|
|
165
|
+
background: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.btn-action:disabled {
|
|
169
|
+
opacity: 0.55;
|
|
170
|
+
cursor: not-allowed;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.slot-list {
|
|
174
|
+
gap: 6px;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.slot-item {
|
|
178
|
+
gap: 8px;
|
|
179
|
+
padding: 8px 10px;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.slot-meta {
|
|
183
|
+
flex: 1;
|
|
184
|
+
min-width: 0;
|
|
185
|
+
display: flex;
|
|
186
|
+
flex-direction: column;
|
|
187
|
+
gap: 2px;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.slot-label {
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
font-weight: var(--dev-wallet-font-weight-medium);
|
|
193
|
+
color: var(--dev-wallet-foreground);
|
|
194
|
+
overflow: hidden;
|
|
195
|
+
text-overflow: ellipsis;
|
|
196
|
+
white-space: nowrap;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
.slot-address {
|
|
200
|
+
font-size: 10px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.slot-toggle {
|
|
204
|
+
padding: 4px 10px;
|
|
205
|
+
border-radius: var(--dev-wallet-radius-xs);
|
|
206
|
+
background: var(--dev-wallet-background);
|
|
207
|
+
border: 1px solid var(--dev-wallet-border);
|
|
208
|
+
color: var(--dev-wallet-muted-foreground);
|
|
209
|
+
font-weight: var(--dev-wallet-font-weight-semibold);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.slot-toggle.on {
|
|
213
|
+
background: var(--dev-wallet-primary);
|
|
214
|
+
color: var(--dev-wallet-primary-foreground);
|
|
215
|
+
border-color: var(--dev-wallet-primary);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.slot-toggle:hover:not(:disabled) {
|
|
219
|
+
filter: brightness(1.05);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.slot-toggle:disabled {
|
|
223
|
+
opacity: 0.55;
|
|
224
|
+
cursor: not-allowed;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.helper-text {
|
|
228
|
+
font-size: 11px;
|
|
229
|
+
color: var(--dev-wallet-muted-foreground);
|
|
230
|
+
margin-top: 6px;
|
|
231
|
+
line-height: 1.4;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.fork-banner {
|
|
235
|
+
padding: 8px 12px;
|
|
236
|
+
background: rgba(234, 179, 8, 0.12);
|
|
237
|
+
border: 1px solid rgba(234, 179, 8, 0.35);
|
|
238
|
+
border-radius: var(--dev-wallet-radius-sm);
|
|
239
|
+
font-size: 11px;
|
|
240
|
+
color: var(--dev-wallet-muted-foreground);
|
|
241
|
+
line-height: 1.4;
|
|
242
|
+
margin-bottom: 14px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.fork-banner strong {
|
|
246
|
+
color: #92400e;
|
|
247
|
+
font-weight: var(--dev-wallet-font-weight-semibold);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.inline-error {
|
|
251
|
+
font-size: 11px;
|
|
252
|
+
margin-top: 6px;
|
|
253
|
+
}
|
|
254
|
+
`
|
|
255
|
+
];
|
|
256
|
+
}
|
|
257
|
+
#pollTimer;
|
|
258
|
+
connectedCallback() {
|
|
259
|
+
super.connectedCallback();
|
|
260
|
+
this.#startPolling();
|
|
261
|
+
this.#refreshAll();
|
|
262
|
+
}
|
|
263
|
+
disconnectedCallback() {
|
|
264
|
+
super.disconnectedCallback();
|
|
265
|
+
this.#stopPolling();
|
|
266
|
+
}
|
|
267
|
+
willUpdate(changed) {
|
|
268
|
+
if (changed.has("relay")) {
|
|
269
|
+
this._status = null;
|
|
270
|
+
this._statusError = null;
|
|
271
|
+
this._slots = [];
|
|
272
|
+
this._slotsError = null;
|
|
273
|
+
if (this.relay !== null) this.#refreshAll();
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
render() {
|
|
277
|
+
if (!this.relay) return html`<div class="empty-state" part="empty-state">
|
|
278
|
+
Fork controls require a devstack wallet-app connection.
|
|
279
|
+
</div>`;
|
|
280
|
+
const upstream = this._status?.upstream ?? this.upstream;
|
|
281
|
+
return html`
|
|
282
|
+
<div class="fork-banner" part="fork-banner">
|
|
283
|
+
<strong>Fork mode:</strong> changes here only affect the local
|
|
284
|
+
${upstream ? html`<em>${upstream}</em>` : "forked"} sui-fork stack — no real funds at risk.
|
|
285
|
+
</div>
|
|
286
|
+
|
|
287
|
+
<div class="section">
|
|
288
|
+
<div class="section-header">Status</div>
|
|
289
|
+
${this.#renderStatus()}
|
|
290
|
+
</div>
|
|
291
|
+
|
|
292
|
+
<div class="section">
|
|
293
|
+
<div class="section-header">Advance clock</div>
|
|
294
|
+
<div class="action-row">
|
|
295
|
+
<input
|
|
296
|
+
class="action-input"
|
|
297
|
+
part="advance-clock-input"
|
|
298
|
+
type="number"
|
|
299
|
+
min="1"
|
|
300
|
+
step="1"
|
|
301
|
+
aria-label="Advance clock duration in ms"
|
|
302
|
+
.value=${this._clockInputMs}
|
|
303
|
+
@input=${this.#onClockInput}
|
|
304
|
+
?disabled=${this._actionInFlight !== null}
|
|
305
|
+
/>
|
|
306
|
+
<button
|
|
307
|
+
class="btn-action"
|
|
308
|
+
part="advance-clock-button"
|
|
309
|
+
?disabled=${this._actionInFlight !== null || !this.#parseClock()}
|
|
310
|
+
@click=${this.#onAdvanceClock}
|
|
311
|
+
>
|
|
312
|
+
${this._actionInFlight === "advance-clock" ? "Advancing…" : "+ ms"}
|
|
313
|
+
</button>
|
|
314
|
+
</div>
|
|
315
|
+
<div class="helper-text">
|
|
316
|
+
Advances <code>clock::timestamp_ms()</code> by the given milliseconds.
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
|
|
320
|
+
<div class="section">
|
|
321
|
+
<div class="section-header">Advance checkpoints</div>
|
|
322
|
+
<div class="action-row">
|
|
323
|
+
<input
|
|
324
|
+
class="action-input"
|
|
325
|
+
part="advance-checkpoint-input"
|
|
326
|
+
type="number"
|
|
327
|
+
min="1"
|
|
328
|
+
step="1"
|
|
329
|
+
aria-label="Advance checkpoint count"
|
|
330
|
+
.value=${this._checkpointInputCount}
|
|
331
|
+
@input=${this.#onCheckpointInput}
|
|
332
|
+
?disabled=${this._actionInFlight !== null}
|
|
333
|
+
/>
|
|
334
|
+
<button
|
|
335
|
+
class="btn-action"
|
|
336
|
+
part="advance-checkpoint-button"
|
|
337
|
+
?disabled=${this._actionInFlight !== null || !this.#parseCheckpointCount()}
|
|
338
|
+
@click=${this.#onAdvanceCheckpoint}
|
|
339
|
+
>
|
|
340
|
+
${this._actionInFlight === "advance-checkpoint" ? "Sealing…" : "+ ckpt"}
|
|
341
|
+
</button>
|
|
342
|
+
</div>
|
|
343
|
+
<div class="helper-text">
|
|
344
|
+
Seals pending transactions into <code>n</code> new checkpoints.
|
|
345
|
+
</div>
|
|
346
|
+
${this._actionError ? html`<div class="inline-error" part="action-error">${this._actionError}</div>` : nothing}
|
|
347
|
+
</div>
|
|
348
|
+
|
|
349
|
+
<div class="section">
|
|
350
|
+
<div class="section-header">Impersonation slots</div>
|
|
351
|
+
${this.#renderSlots()}
|
|
352
|
+
</div>
|
|
353
|
+
`;
|
|
354
|
+
}
|
|
355
|
+
#renderStatus() {
|
|
356
|
+
if (this._statusLoading && this._status === null) return html`<div class="loading" part="status-loading">Loading fork status…</div>`;
|
|
357
|
+
if (this._statusError) return html` <div class="error-state" part="status-error">${this._statusError}</div> `;
|
|
358
|
+
if (!this._status) return html`<div class="empty-state" part="status-empty">Fork status unavailable.</div>`;
|
|
359
|
+
const { checkpoint, clockMs, autoTickMs } = this._status;
|
|
360
|
+
const clockIso = (() => {
|
|
361
|
+
try {
|
|
362
|
+
return new Date(Number(clockMs)).toISOString();
|
|
363
|
+
} catch {
|
|
364
|
+
return "—";
|
|
365
|
+
}
|
|
366
|
+
})();
|
|
367
|
+
return html`
|
|
368
|
+
<div class="status-grid" part="status-grid">
|
|
369
|
+
<span class="status-label">Checkpoint</span>
|
|
370
|
+
<span class="status-value" part="status-checkpoint">${checkpoint.toString()}</span>
|
|
371
|
+
<span class="status-label">Clock</span>
|
|
372
|
+
<span class="status-value" part="status-clock">${clockMs.toString()}</span>
|
|
373
|
+
<span class="status-label">UTC</span>
|
|
374
|
+
<span class="status-value dim" part="status-clock-iso">${clockIso}</span>
|
|
375
|
+
<span class="status-label">Auto-tick</span>
|
|
376
|
+
<span class="status-value dim" part="status-auto-tick">
|
|
377
|
+
${autoTickMs ? `${autoTickMs}ms` : "off"}
|
|
378
|
+
</span>
|
|
379
|
+
</div>
|
|
380
|
+
`;
|
|
381
|
+
}
|
|
382
|
+
#renderSlots() {
|
|
383
|
+
if (this._slotsError) return html`<div class="error-state" part="slots-error">${this._slotsError}</div>`;
|
|
384
|
+
if (this._slots.length === 0) return html`<div class="empty-state" part="slots-empty">
|
|
385
|
+
No impersonation slots configured. Add addresses via
|
|
386
|
+
<code>Sui({fork:{impersonate:[…]}})</code>.
|
|
387
|
+
</div>`;
|
|
388
|
+
return html`
|
|
389
|
+
<div class="slot-list" part="slot-list">
|
|
390
|
+
${this._slots.map((slot) => {
|
|
391
|
+
const inFlight = this._slotToggleInFlight === slot.address;
|
|
392
|
+
return html`
|
|
393
|
+
<div
|
|
394
|
+
class=${slot.active ? "slot-item active" : "slot-item"}
|
|
395
|
+
part=${slot.active ? "slot-item slot-item-active" : "slot-item"}
|
|
396
|
+
>
|
|
397
|
+
<div class="slot-meta">
|
|
398
|
+
<span class="slot-label">${slot.label ?? formatAddress(slot.address)}</span>
|
|
399
|
+
<span class="slot-address">${formatAddress(slot.address)}</span>
|
|
400
|
+
</div>
|
|
401
|
+
<button
|
|
402
|
+
class=${slot.active ? "slot-toggle on" : "slot-toggle"}
|
|
403
|
+
part="slot-toggle"
|
|
404
|
+
aria-pressed=${slot.active}
|
|
405
|
+
?disabled=${inFlight}
|
|
406
|
+
@click=${() => this.#onToggleSlot(slot)}
|
|
407
|
+
>
|
|
408
|
+
${inFlight ? "…" : slot.active ? "On" : "Off"}
|
|
409
|
+
</button>
|
|
410
|
+
</div>
|
|
411
|
+
`;
|
|
412
|
+
})}
|
|
413
|
+
</div>
|
|
414
|
+
<div class="helper-text">
|
|
415
|
+
When <strong>On</strong>, user-driven tx signing for the matching account routes through
|
|
416
|
+
<code>executeImpersonated</code> instead of a real signature.
|
|
417
|
+
</div>
|
|
418
|
+
`;
|
|
419
|
+
}
|
|
420
|
+
#onClockInput;
|
|
421
|
+
#onCheckpointInput;
|
|
422
|
+
#parseClock() {
|
|
423
|
+
const n = Number(this._clockInputMs);
|
|
424
|
+
if (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;
|
|
425
|
+
return n;
|
|
426
|
+
}
|
|
427
|
+
#parseCheckpointCount() {
|
|
428
|
+
const n = Number(this._checkpointInputCount);
|
|
429
|
+
if (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;
|
|
430
|
+
return n;
|
|
431
|
+
}
|
|
432
|
+
#onAdvanceClock;
|
|
433
|
+
#onAdvanceCheckpoint;
|
|
434
|
+
#onToggleSlot;
|
|
435
|
+
#startPolling() {
|
|
436
|
+
this.#stopPolling();
|
|
437
|
+
this.#pollTimer = setInterval(() => {
|
|
438
|
+
this.#refreshStatus();
|
|
439
|
+
}, STATUS_POLL_MS);
|
|
440
|
+
}
|
|
441
|
+
#stopPolling() {
|
|
442
|
+
if (this.#pollTimer !== null) {
|
|
443
|
+
clearInterval(this.#pollTimer);
|
|
444
|
+
this.#pollTimer = null;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
async #refreshAll() {
|
|
448
|
+
await Promise.all([this.#refreshStatus(), this.#refreshSlots()]);
|
|
449
|
+
}
|
|
450
|
+
async #refreshStatus() {
|
|
451
|
+
if (!this.relay) return;
|
|
452
|
+
this._statusLoading = true;
|
|
453
|
+
try {
|
|
454
|
+
const result = await this.relay.getStatus();
|
|
455
|
+
if (result.ok) {
|
|
456
|
+
this._status = result.value;
|
|
457
|
+
this._statusError = null;
|
|
458
|
+
} else this._statusError = result.error;
|
|
459
|
+
} catch (error) {
|
|
460
|
+
this._statusError = getErrorMessage(error, "status refresh failed");
|
|
461
|
+
} finally {
|
|
462
|
+
this._statusLoading = false;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
async #refreshSlots() {
|
|
466
|
+
if (!this.relay) return;
|
|
467
|
+
try {
|
|
468
|
+
const result = await this.relay.listImpersonations();
|
|
469
|
+
if (result.ok) {
|
|
470
|
+
this._slots = result.value;
|
|
471
|
+
this._slotsError = null;
|
|
472
|
+
} else this._slotsError = result.error;
|
|
473
|
+
} catch (error) {
|
|
474
|
+
this._slotsError = getErrorMessage(error, "slot refresh failed");
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/** Public hook for tests + external consumers (e.g. signing-modal
|
|
478
|
+
* wants to re-read slots after a transaction lands). Resolves once
|
|
479
|
+
* both status + slots have refreshed. */
|
|
480
|
+
async refresh() {
|
|
481
|
+
await this.#refreshAll();
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
__decorate([property({ attribute: false })], DevWalletForkPanel.prototype, "relay", void 0);
|
|
485
|
+
__decorate([property({ type: String })], DevWalletForkPanel.prototype, "upstream", void 0);
|
|
486
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_status", void 0);
|
|
487
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_statusError", void 0);
|
|
488
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_statusLoading", void 0);
|
|
489
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_actionInFlight", void 0);
|
|
490
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_actionError", void 0);
|
|
491
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_slots", void 0);
|
|
492
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_slotsError", void 0);
|
|
493
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_slotToggleInFlight", void 0);
|
|
494
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_clockInputMs", void 0);
|
|
495
|
+
__decorate([state()], DevWalletForkPanel.prototype, "_checkpointInputCount", void 0);
|
|
496
|
+
DevWalletForkPanel = __decorate([customElement("dev-wallet-fork-panel")], DevWalletForkPanel);
|
|
497
|
+
//#endregion
|
|
498
|
+
export { DevWalletForkPanel };
|
|
499
|
+
|
|
500
|
+
//# sourceMappingURL=dev-wallet-fork-panel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-fork-panel.mjs","names":["#parseClock","#parseCheckpointCount","#startPolling","#refreshAll","#stopPolling","#renderStatus","#onClockInput","#onAdvanceClock","#onCheckpointInput","#onAdvanceCheckpoint","#renderSlots","#onToggleSlot","#pollTimer","#refreshStatus","#refreshSlots"],"sources":["../../src/ui/dev-wallet-fork-panel.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n//\n// Dev-wallet fork-controls panel. Renders when the active stack is in\n// `runtime === 'forked'` mode and surfaces a curated slice of the\n// sui-fork admin API to the operator: status read, advance-clock,\n// advance-checkpoint, and impersonation slot toggles.\n\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { ForkImpersonationSlot, ForkRelay, ForkStatus } from '../adapters/fork-relay.js';\nimport {\n\tactionButtonStyles,\n\tcardItemStyles,\n\tformInputStyles,\n\tinlineErrorStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsectionHeaderStyles,\n\tsubLabelStyles,\n\tsharedStyles,\n\tstateStyles,\n} from './styles.js';\nimport { formatAddress, getErrorMessage } from './utils.js';\n\n/** Default polling cadence for `GetStatus`. Slow on purpose — the panel\n * also refreshes after every action verb lands. */\nconst STATUS_POLL_MS = 4000;\n\n@customElement('dev-wallet-fork-panel')\nexport class DevWalletForkPanel extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tsectionHeaderStyles,\n\t\tactionButtonStyles,\n\t\tstateStyles,\n\t\tcardItemStyles,\n\t\tlistContainerStyles,\n\t\tformInputStyles,\n\t\tinlineErrorStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 18px;\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.status-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: max-content 1fr;\n\t\t\t\tcolumn-gap: 12px;\n\t\t\t\trow-gap: 6px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-md);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-secondary);\n\t\t\t}\n\n\t\t\t.status-label {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\talign-self: center;\n\t\t\t}\n\n\t\t\t.status-value {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.status-value.dim {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.action-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 6px;\n\t\t\t\talign-items: stretch;\n\t\t\t}\n\n\t\t\t.action-input {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t}\n\n\t\t\t.btn-action {\n\t\t\t\tmin-width: 96px;\n\t\t\t\tpadding: 0 14px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\ttransition: background-color 0.15s;\n\t\t\t}\n\n\t\t\t.btn-action:hover:not(:disabled) {\n\t\t\t\tbackground: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);\n\t\t\t}\n\n\t\t\t.btn-action:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.slot-list {\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.slot-item {\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t}\n\n\t\t\t.slot-meta {\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 2px;\n\t\t\t}\n\n\t\t\t.slot-label {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.slot-address {\n\t\t\t\tfont-size: 10px;\n\t\t\t}\n\n\t\t\t.slot-toggle {\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.slot-toggle.on {\n\t\t\t\tbackground: var(--dev-wallet-primary);\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tborder-color: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.slot-toggle:hover:not(:disabled) {\n\t\t\t\tfilter: brightness(1.05);\n\t\t\t}\n\n\t\t\t.slot-toggle:disabled {\n\t\t\t\topacity: 0.55;\n\t\t\t\tcursor: not-allowed;\n\t\t\t}\n\n\t\t\t.helper-text {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmargin-top: 6px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.fork-banner {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder: 1px solid rgba(234, 179, 8, 0.35);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-sm);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.4;\n\t\t\t\tmargin-bottom: 14px;\n\t\t\t}\n\n\t\t\t.fork-banner strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.inline-error {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tmargin-top: 6px;\n\t\t\t}\n\t\t`,\n\t];\n\n\t/** Fork relay client. Provided by the parent (`wallet-controller`)\n\t * when the active manifest exposes a forked stack. When `null`,\n\t * the panel renders an empty state — the tab gating in the\n\t * controller normally prevents this. */\n\t@property({ attribute: false })\n\trelay: ForkRelay | null = null;\n\n\t/** Upstream label (`'mainnet'`, `'testnet'`, …). Surfaced in the\n\t * banner so the operator can't misread which chain the fork forked. */\n\t@property({ type: String })\n\tupstream = '';\n\n\t@state()\n\tprivate _status: ForkStatus | null = null;\n\n\t@state()\n\tprivate _statusError: string | null = null;\n\n\t@state()\n\tprivate _statusLoading = false;\n\n\t@state()\n\tprivate _actionInFlight: 'advance-clock' | 'advance-checkpoint' | null = null;\n\n\t@state()\n\tprivate _actionError: string | null = null;\n\n\t@state()\n\tprivate _slots: ForkImpersonationSlot[] = [];\n\n\t@state()\n\tprivate _slotsError: string | null = null;\n\n\t@state()\n\tprivate _slotToggleInFlight: string | null = null;\n\n\t@state()\n\tprivate _clockInputMs = '1000';\n\n\t@state()\n\tprivate _checkpointInputCount = '1';\n\n\t#pollTimer: ReturnType<typeof setInterval> | null = null;\n\n\toverride connectedCallback() {\n\t\tsuper.connectedCallback();\n\t\tthis.#startPolling();\n\t\tvoid this.#refreshAll();\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tthis.#stopPolling();\n\t}\n\n\toverride willUpdate(changed: Map<string, unknown>) {\n\t\tif (changed.has('relay')) {\n\t\t\tthis._status = null;\n\t\t\tthis._statusError = null;\n\t\t\tthis._slots = [];\n\t\t\tthis._slotsError = null;\n\t\t\tif (this.relay !== null) {\n\t\t\t\tvoid this.#refreshAll();\n\t\t\t}\n\t\t}\n\t}\n\n\toverride render() {\n\t\tif (!this.relay) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"empty-state\">\n\t\t\t\tFork controls require a devstack wallet-app connection.\n\t\t\t</div>`;\n\t\t}\n\n\t\tconst upstream = this._status?.upstream ?? this.upstream;\n\t\treturn html`\n\t\t\t<div class=\"fork-banner\" part=\"fork-banner\">\n\t\t\t\t<strong>Fork mode:</strong> changes here only affect the local\n\t\t\t\t${upstream ? html`<em>${upstream}</em>` : 'forked'} sui-fork stack — no real funds at risk.\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Status</div>\n\t\t\t\t${this.#renderStatus()}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance clock</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-clock-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance clock duration in ms\"\n\t\t\t\t\t\t.value=${this._clockInputMs}\n\t\t\t\t\t\t@input=${this.#onClockInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-clock-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseClock()}\n\t\t\t\t\t\t@click=${this.#onAdvanceClock}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-clock' ? 'Advancing…' : '+ ms'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tAdvances <code>clock::timestamp_ms()</code> by the given milliseconds.\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Advance checkpoints</div>\n\t\t\t\t<div class=\"action-row\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tclass=\"action-input\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-input\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\taria-label=\"Advance checkpoint count\"\n\t\t\t\t\t\t.value=${this._checkpointInputCount}\n\t\t\t\t\t\t@input=${this.#onCheckpointInput}\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null}\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"btn-action\"\n\t\t\t\t\t\tpart=\"advance-checkpoint-button\"\n\t\t\t\t\t\t?disabled=${this._actionInFlight !== null || !this.#parseCheckpointCount()}\n\t\t\t\t\t\t@click=${this.#onAdvanceCheckpoint}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this._actionInFlight === 'advance-checkpoint' ? 'Sealing…' : '+ ckpt'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"helper-text\">\n\t\t\t\t\tSeals pending transactions into <code>n</code> new checkpoints.\n\t\t\t\t</div>\n\t\t\t\t${this._actionError\n\t\t\t\t\t? html`<div class=\"inline-error\" part=\"action-error\">${this._actionError}</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</div>\n\n\t\t\t<div class=\"section\">\n\t\t\t\t<div class=\"section-header\">Impersonation slots</div>\n\t\t\t\t${this.#renderSlots()}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderStatus() {\n\t\tif (this._statusLoading && this._status === null) {\n\t\t\treturn html`<div class=\"loading\" part=\"status-loading\">Loading fork status…</div>`;\n\t\t}\n\t\tif (this._statusError) {\n\t\t\treturn html` <div class=\"error-state\" part=\"status-error\">${this._statusError}</div> `;\n\t\t}\n\t\tif (!this._status) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"status-empty\">Fork status unavailable.</div>`;\n\t\t}\n\t\tconst { checkpoint, clockMs, autoTickMs } = this._status;\n\t\tconst clockIso = (() => {\n\t\t\ttry {\n\t\t\t\treturn new Date(Number(clockMs)).toISOString();\n\t\t\t} catch {\n\t\t\t\treturn '—';\n\t\t\t}\n\t\t})();\n\t\treturn html`\n\t\t\t<div class=\"status-grid\" part=\"status-grid\">\n\t\t\t\t<span class=\"status-label\">Checkpoint</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-checkpoint\">${checkpoint.toString()}</span>\n\t\t\t\t<span class=\"status-label\">Clock</span>\n\t\t\t\t<span class=\"status-value\" part=\"status-clock\">${clockMs.toString()}</span>\n\t\t\t\t<span class=\"status-label\">UTC</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-clock-iso\">${clockIso}</span>\n\t\t\t\t<span class=\"status-label\">Auto-tick</span>\n\t\t\t\t<span class=\"status-value dim\" part=\"status-auto-tick\">\n\t\t\t\t\t${autoTickMs ? `${autoTickMs}ms` : 'off'}\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderSlots() {\n\t\tif (this._slotsError) {\n\t\t\treturn html`<div class=\"error-state\" part=\"slots-error\">${this._slotsError}</div>`;\n\t\t}\n\t\tif (this._slots.length === 0) {\n\t\t\treturn html`<div class=\"empty-state\" part=\"slots-empty\">\n\t\t\t\tNo impersonation slots configured. Add addresses via\n\t\t\t\t<code>Sui({fork:{impersonate:[…]}})</code>.\n\t\t\t</div>`;\n\t\t}\n\t\treturn html`\n\t\t\t<div class=\"slot-list\" part=\"slot-list\">\n\t\t\t\t${this._slots.map((slot) => {\n\t\t\t\t\tconst inFlight = this._slotToggleInFlight === slot.address;\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=${slot.active ? 'slot-item active' : 'slot-item'}\n\t\t\t\t\t\t\tpart=${slot.active ? 'slot-item slot-item-active' : 'slot-item'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"slot-meta\">\n\t\t\t\t\t\t\t\t<span class=\"slot-label\">${slot.label ?? formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t\t<span class=\"slot-address\">${formatAddress(slot.address)}</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=${slot.active ? 'slot-toggle on' : 'slot-toggle'}\n\t\t\t\t\t\t\t\tpart=\"slot-toggle\"\n\t\t\t\t\t\t\t\taria-pressed=${slot.active}\n\t\t\t\t\t\t\t\t?disabled=${inFlight}\n\t\t\t\t\t\t\t\t@click=${() => this.#onToggleSlot(slot)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${inFlight ? '…' : slot.active ? 'On' : 'Off'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t\t<div class=\"helper-text\">\n\t\t\t\tWhen <strong>On</strong>, user-driven tx signing for the matching account routes through\n\t\t\t\t<code>executeImpersonated</code> instead of a real signature.\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t// ── Input bindings ────────────────────────────────────────────────────\n\n\t#onClockInput = (e: Event) => {\n\t\tthis._clockInputMs = (e.target as HTMLInputElement).value;\n\t};\n\n\t#onCheckpointInput = (e: Event) => {\n\t\tthis._checkpointInputCount = (e.target as HTMLInputElement).value;\n\t};\n\n\t#parseClock(): number | null {\n\t\tconst n = Number(this._clockInputMs);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t#parseCheckpointCount(): number | null {\n\t\tconst n = Number(this._checkpointInputCount);\n\t\tif (!Number.isFinite(n) || n <= 0 || !Number.isInteger(n)) return null;\n\t\treturn n;\n\t}\n\n\t// ── Action handlers ───────────────────────────────────────────────────\n\n\t#onAdvanceClock = async () => {\n\t\tconst ms = this.#parseClock();\n\t\tif (ms === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-clock';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceClock(ms);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-clock failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onAdvanceCheckpoint = async () => {\n\t\tconst count = this.#parseCheckpointCount();\n\t\tif (count === null || !this.relay) return;\n\t\tthis._actionInFlight = 'advance-checkpoint';\n\t\tthis._actionError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.advanceCheckpoint(count);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t} else {\n\t\t\t\tthis._actionError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._actionError = getErrorMessage(error, 'advance-checkpoint failed');\n\t\t} finally {\n\t\t\tthis._actionInFlight = null;\n\t\t}\n\t};\n\n\t#onToggleSlot = async (slot: ForkImpersonationSlot) => {\n\t\tif (!this.relay || this._slotToggleInFlight !== null) return;\n\t\tthis._slotToggleInFlight = slot.address;\n\t\tthis._slotsError = null;\n\t\ttry {\n\t\t\tconst result = await this.relay.setImpersonation(slot.address, !slot.active);\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\t// Notify dapp-level integrations (`wallet-controller`) so the\n\t\t\t\t// signing modal flips its impersonation footnote in lock-step\n\t\t\t\t// with the toggle. Composed/bubbling so the host element sees\n\t\t\t\t// it regardless of where the panel was mounted.\n\t\t\t\tthis.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('fork-impersonation-changed', {\n\t\t\t\t\t\tbubbles: true,\n\t\t\t\t\t\tcomposed: true,\n\t\t\t\t\t\tdetail: {\n\t\t\t\t\t\t\taddress: slot.address,\n\t\t\t\t\t\t\tactive: !slot.active,\n\t\t\t\t\t\t\tslots: result.value,\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'toggle failed');\n\t\t} finally {\n\t\t\tthis._slotToggleInFlight = null;\n\t\t}\n\t};\n\n\t// ── Polling ───────────────────────────────────────────────────────────\n\n\t#startPolling() {\n\t\tthis.#stopPolling();\n\t\tthis.#pollTimer = setInterval(() => {\n\t\t\tvoid this.#refreshStatus();\n\t\t}, STATUS_POLL_MS);\n\t}\n\n\t#stopPolling() {\n\t\tif (this.#pollTimer !== null) {\n\t\t\tclearInterval(this.#pollTimer);\n\t\t\tthis.#pollTimer = null;\n\t\t}\n\t}\n\n\tasync #refreshAll(): Promise<void> {\n\t\tawait Promise.all([this.#refreshStatus(), this.#refreshSlots()]);\n\t}\n\n\tasync #refreshStatus(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\tthis._statusLoading = true;\n\t\ttry {\n\t\t\tconst result = await this.relay.getStatus();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._status = result.value;\n\t\t\t\tthis._statusError = null;\n\t\t\t} else {\n\t\t\t\tthis._statusError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._statusError = getErrorMessage(error, 'status refresh failed');\n\t\t} finally {\n\t\t\tthis._statusLoading = false;\n\t\t}\n\t}\n\n\tasync #refreshSlots(): Promise<void> {\n\t\tif (!this.relay) return;\n\t\ttry {\n\t\t\tconst result = await this.relay.listImpersonations();\n\t\t\tif (result.ok) {\n\t\t\t\tthis._slots = result.value;\n\t\t\t\tthis._slotsError = null;\n\t\t\t} else {\n\t\t\t\tthis._slotsError = result.error;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis._slotsError = getErrorMessage(error, 'slot refresh failed');\n\t\t}\n\t}\n\n\t/** Public hook for tests + external consumers (e.g. signing-modal\n\t * wants to re-read slots after a transaction lands). Resolves once\n\t * both status + slots have refreshed. */\n\tasync refresh(): Promise<void> {\n\t\tawait this.#refreshAll();\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-fork-panel': DevWalletForkPanel;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import * as lit38 from "lit";
|
|
1
|
+
import * as _$lit from "lit";
|
|
3
2
|
import { LitElement } from "lit";
|
|
4
3
|
|
|
5
4
|
//#region src/ui/dev-wallet-network-badge.d.ts
|
|
6
5
|
declare class DevWalletNetworkBadge extends LitElement {
|
|
7
6
|
#private;
|
|
8
|
-
static styles: (
|
|
7
|
+
static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
|
|
9
8
|
active: string;
|
|
10
9
|
networks: string[];
|
|
11
10
|
private _open;
|
|
12
|
-
render():
|
|
11
|
+
render(): _$lit.TemplateResult<1>;
|
|
13
12
|
}
|
|
14
13
|
declare global {
|
|
15
14
|
interface HTMLElementTagNameMap {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-wallet-network-badge.d.mts","names":[],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev-wallet-network-badge.d.mts","names":[],"sources":["../../src/ui/dev-wallet-network-badge.ts"],"mappings":";;;;cAWa,qBAAA,SAA8B,UAAA;EAAA;SAC1B,MAAA,GADkB,KAAA,CACZ,SAAA,GAAA,KAAA,CAAA,SAAA;EA4EtB,MAAA;EAGA,QAAA;EAAA,QAGQ,KAAA;EAEC,MAAA,CAAA,GApFa,KAAA,CAoFP,cAAA;AAAA;AAAA,QAkER,MAAA;EAAA,UACG,qBAAA;IACT,0BAAA,EAA4B,qBAAA;EAAA;AAAA"}
|