@nexus-cross/crossx-sdk-core 0.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +302 -0
  2. package/dist/__tests__/mocks/MockCryptoPort.d.ts +15 -0
  3. package/dist/__tests__/mocks/MockCryptoPort.d.ts.map +1 -0
  4. package/dist/__tests__/mocks/MockOAuthPort.d.ts +11 -0
  5. package/dist/__tests__/mocks/MockOAuthPort.d.ts.map +1 -0
  6. package/dist/__tests__/mocks/MockStoragePort.d.ts +18 -0
  7. package/dist/__tests__/mocks/MockStoragePort.d.ts.map +1 -0
  8. package/dist/__tests__/mocks/MockTransportPort.d.ts +14 -0
  9. package/dist/__tests__/mocks/MockTransportPort.d.ts.map +1 -0
  10. package/dist/__tests__/mocks/MockWalletProviderPort.d.ts +28 -0
  11. package/dist/__tests__/mocks/MockWalletProviderPort.d.ts.map +1 -0
  12. package/dist/__tests__/sdk/CROSSxSDK.test.d.ts +2 -0
  13. package/dist/__tests__/sdk/CROSSxSDK.test.d.ts.map +1 -0
  14. package/dist/__tests__/sdk/EthereumProvider.test.d.ts +2 -0
  15. package/dist/__tests__/sdk/EthereumProvider.test.d.ts.map +1 -0
  16. package/dist/__tests__/usecases/SignInUseCase.test.d.ts +2 -0
  17. package/dist/__tests__/usecases/SignInUseCase.test.d.ts.map +1 -0
  18. package/dist/__tests__/usecases/SignOutUseCase.test.d.ts +2 -0
  19. package/dist/__tests__/usecases/SignOutUseCase.test.d.ts.map +1 -0
  20. package/dist/__tests__/usecases/WithdrawUseCase.test.d.ts +2 -0
  21. package/dist/__tests__/usecases/WithdrawUseCase.test.d.ts.map +1 -0
  22. package/dist/adapters/confirmation/BrowserConfirmationAdapter.d.ts +36 -0
  23. package/dist/adapters/confirmation/BrowserConfirmationAdapter.d.ts.map +1 -0
  24. package/dist/adapters/crypto/JoseCryptoAdapter.d.ts +16 -0
  25. package/dist/adapters/crypto/JoseCryptoAdapter.d.ts.map +1 -0
  26. package/dist/adapters/index.d.ts +10 -0
  27. package/dist/adapters/index.d.ts.map +1 -0
  28. package/dist/adapters/oauth/BrowserOAuthAdapter.d.ts +7 -0
  29. package/dist/adapters/oauth/BrowserOAuthAdapter.d.ts.map +1 -0
  30. package/dist/adapters/storage/LocalStorageAdapter.d.ts +10 -0
  31. package/dist/adapters/storage/LocalStorageAdapter.d.ts.map +1 -0
  32. package/dist/adapters/transport/FetchTransportAdapter.d.ts +6 -0
  33. package/dist/adapters/transport/FetchTransportAdapter.d.ts.map +1 -0
  34. package/dist/adapters/wallet/MockWalletProviderAdapter.d.ts +28 -0
  35. package/dist/adapters/wallet/MockWalletProviderAdapter.d.ts.map +1 -0
  36. package/dist/adapters/wallet/RemoteWalletProviderAdapter.d.ts +47 -0
  37. package/dist/adapters/wallet/RemoteWalletProviderAdapter.d.ts.map +1 -0
  38. package/dist/adapters/wallet/types.d.ts +112 -0
  39. package/dist/adapters/wallet/types.d.ts.map +1 -0
  40. package/dist/core/index.d.ts +9 -0
  41. package/dist/core/index.d.ts.map +1 -0
  42. package/dist/core/ports/ConfirmationPort.d.ts +74 -0
  43. package/dist/core/ports/ConfirmationPort.d.ts.map +1 -0
  44. package/dist/core/ports/CryptoPort.d.ts +43 -0
  45. package/dist/core/ports/CryptoPort.d.ts.map +1 -0
  46. package/dist/core/ports/LoggerPort.d.ts +23 -0
  47. package/dist/core/ports/LoggerPort.d.ts.map +1 -0
  48. package/dist/core/ports/OAuthPort.d.ts +18 -0
  49. package/dist/core/ports/OAuthPort.d.ts.map +1 -0
  50. package/dist/core/ports/StoragePort.d.ts +25 -0
  51. package/dist/core/ports/StoragePort.d.ts.map +1 -0
  52. package/dist/core/ports/TransportPort.d.ts +24 -0
  53. package/dist/core/ports/TransportPort.d.ts.map +1 -0
  54. package/dist/core/ports/WalletProviderPort.d.ts +106 -0
  55. package/dist/core/ports/WalletProviderPort.d.ts.map +1 -0
  56. package/dist/core/ports/index.d.ts +12 -0
  57. package/dist/core/ports/index.d.ts.map +1 -0
  58. package/dist/core/services/TokenMemoryStore.d.ts +17 -0
  59. package/dist/core/services/TokenMemoryStore.d.ts.map +1 -0
  60. package/dist/core/types/caip.d.ts +119 -0
  61. package/dist/core/types/caip.d.ts.map +1 -0
  62. package/dist/core/types/chain.d.ts +90 -0
  63. package/dist/core/types/chain.d.ts.map +1 -0
  64. package/dist/core/types/errors.d.ts +56 -0
  65. package/dist/core/types/errors.d.ts.map +1 -0
  66. package/dist/core/types/index.d.ts +309 -0
  67. package/dist/core/types/index.d.ts.map +1 -0
  68. package/dist/core/types/prepare.d.ts +21 -0
  69. package/dist/core/types/prepare.d.ts.map +1 -0
  70. package/dist/core/usecases/MigrateWalletUseCase.d.ts +10 -0
  71. package/dist/core/usecases/MigrateWalletUseCase.d.ts.map +1 -0
  72. package/dist/core/usecases/SignInUseCase.d.ts +38 -0
  73. package/dist/core/usecases/SignInUseCase.d.ts.map +1 -0
  74. package/dist/core/usecases/SignOutUseCase.d.ts +10 -0
  75. package/dist/core/usecases/SignOutUseCase.d.ts.map +1 -0
  76. package/dist/core/usecases/WithdrawUseCase.d.ts +11 -0
  77. package/dist/core/usecases/WithdrawUseCase.d.ts.map +1 -0
  78. package/dist/core/usecases/index.d.ts +9 -0
  79. package/dist/core/usecases/index.d.ts.map +1 -0
  80. package/dist/core/utils/apiUrl.d.ts +16 -0
  81. package/dist/core/utils/apiUrl.d.ts.map +1 -0
  82. package/dist/core/utils/logger.d.ts +19 -0
  83. package/dist/core/utils/logger.d.ts.map +1 -0
  84. package/dist/index.cjs +939 -0
  85. package/dist/index.d.ts +14 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +4773 -0
  88. package/dist/sdk/CROSSxSDK.d.ts +278 -0
  89. package/dist/sdk/CROSSxSDK.d.ts.map +1 -0
  90. package/dist/sdk/EthereumProvider.d.ts +32 -0
  91. package/dist/sdk/EthereumProvider.d.ts.map +1 -0
  92. package/dist/sdk/factory.d.ts +8 -0
  93. package/dist/sdk/factory.d.ts.map +1 -0
  94. package/package.json +52 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,939 @@
1
+ "use strict";var ur=Object.defineProperty;var hr=(s,e,r)=>e in s?ur(s,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[e]=r;var w=(s,e,r)=>hr(s,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const fr=require("jose");var p=(s=>(s.AUTH_NOT_INITIALIZED="AUTH_NOT_INITIALIZED",s.AUTH_FAILED="AUTH_FAILED",s.AUTH_TOKEN_INVALID="AUTH_TOKEN_INVALID",s.AUTH_TOKEN_EXPIRED="AUTH_TOKEN_EXPIRED",s.AUTH_NOT_AUTHENTICATED="AUTH_NOT_AUTHENTICATED",s.WALLET_NOT_FOUND="WALLET_NOT_FOUND",s.WALLET_CREATION_FAILED="WALLET_CREATION_FAILED",s.SIGN_FAILED="SIGN_FAILED",s.SIGN_REJECTED="SIGN_REJECTED",s.TX_FAILED="TX_FAILED",s.TX_REJECTED="TX_REJECTED",s.USER_REJECTED="USER_REJECTED",s.TX_INVALID_PARAMS="TX_INVALID_PARAMS",s.NETWORK_ERROR="NETWORK_ERROR",s.NETWORK_NOT_CONFIGURED="NETWORK_NOT_CONFIGURED",s.INVALID_CHAIN="INVALID_CHAIN",s.CHAIN_NOT_SUPPORTED="CHAIN_NOT_SUPPORTED",s.CHAIN_ADAPTER_NOT_FOUND="CHAIN_ADAPTER_NOT_FOUND",s.NOT_IMPLEMENTED="NOT_IMPLEMENTED",s.SIGNATURE_FAILED="SIGNATURE_FAILED",s.TRANSACTION_FAILED="TRANSACTION_FAILED",s.PREPARE_FAILED="PREPARE_FAILED",s.PREPARE_EXPIRED="PREPARE_EXPIRED",s.PREPARE_MISMATCH="PREPARE_MISMATCH",s.MIGRATION_FAILED="MIGRATION_FAILED",s.MIGRATION_BACKUP_EXISTS="MIGRATION_BACKUP_EXISTS",s.GATEWAY_INTERNAL_ERROR="GATEWAY_INTERNAL_ERROR",s.GATEWAY_LOCK_CONFLICT="GATEWAY_LOCK_CONFLICT",s.PROJECT_ID_MISSING="PROJECT_ID_MISSING",s.ORIGIN_OR_APP_ID_MISSING="ORIGIN_OR_APP_ID_MISSING",s.INVALID_APP_TYPE="INVALID_APP_TYPE",s.PROJECT_NOT_REGISTERED="PROJECT_NOT_REGISTERED",s.SIGNATURE_SIGNER_MISMATCH="SIGNATURE_SIGNER_MISMATCH",s.INVALID_CONFIG="INVALID_CONFIG",s.UNKNOWN_ERROR="UNKNOWN_ERROR",s))(p||{});class m extends Error{constructor(e,r,t){super(r),this.code=e,this.details=t,this.name="CROSSxError",Object.setPrototypeOf(this,m.prototype)}toJSON(){return{name:this.name,code:this.code,message:this.message,details:this.details}}}class Pt{constructor(e,r){this.sdk=e,this.chainId=r,this._listeners=new Map}async request({method:e,params:r=[]}){switch(e){case"eth_accounts":case"eth_requestAccounts":{const t=await this.sdk.getAddress();return t?[t.address]:[]}case"eth_chainId":return this._caip2ToHex(this.chainId);case"net_version":return this.chainId.split(":")[1]??"1";case"eth_signTransaction":{const t=this._normalizeEIP1193Tx(r[0]);return(await this.sdk.signTransaction(this.chainId,t)).signedTx}case"eth_sendTransaction":{const t=this._normalizeEIP1193Tx(r[0]);return(await this.sdk.sendTransaction(this.chainId,t)).txHash}case"personal_sign":case"eth_sign":throw new m(p.NOT_IMPLEMENTED,`${e} is not yet supported. Use sdk.signMessage() directly.`);case"eth_signTypedData":case"eth_signTypedData_v1":case"eth_signTypedData_v3":case"eth_signTypedData_v4":throw new m(p.NOT_IMPLEMENTED,`${e} is not yet supported. Use sdk.signTypedData() directly.`);default:return this.sdk.walletRpc(e,r,this.chainId)}}on(e,r){return this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(r),this}removeListener(e,r){var t;return(t=this._listeners.get(e))==null||t.delete(r),this}emit(e,...r){var t;(t=this._listeners.get(e))==null||t.forEach(n=>n(...r))}_caip2ToHex(e){const r=e.split(":");return`0x${parseInt(r[1]??"1",10).toString(16)}`}_normalizeEIP1193Tx(e){return{from:e.from,to:e.to,value:e.value,data:e.data,gasLimit:e.gasLimit??e.gas,gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas,nonce:e.nonce!==void 0?parseInt(String(e.nonce),16):void 0,chainId:parseInt(this.chainId.split(":")[1]??"1",10)}}}const ht="__crossx-confirm-style",te="__crossx-confirm-overlay",gr={light:{bg:"#FFFFFF",border:"rgba(18,18,18,0.05)",titleColor:"#121212",subtitleColor:"rgba(18,18,18,0.7)",labelColor:"rgba(18,18,18,0.5)",valueColor:"#121212",pillBg:"rgba(18,18,18,0.05)",pillFromColor:"rgba(18,18,18,0.5)",pillAmtColor:"#121212",divider:"rgba(18,18,18,0.1)",closeColor:"#121212",closeHoverBg:"rgba(18,18,18,0.05)",copyColor:"rgba(18,18,18,0.5)",inputBg:"#FFFFFF",inputBorder:"rgba(18,18,18,0.1)",hintColor:"rgba(18,18,18,0.5)",primary:"#019D92",primaryGlow:"rgba(1,157,146,0.15)",secondary:"#E70077",onPrimary:"#FFFFFF"},dark:{bg:"#121212",border:"rgba(255,255,255,0.05)",titleColor:"#FFFFFF",subtitleColor:"rgba(255,255,255,0.7)",labelColor:"rgba(255,255,255,0.5)",valueColor:"#FFFFFF",pillBg:"rgba(255,255,255,0.05)",pillFromColor:"rgba(255,255,255,0.5)",pillAmtColor:"#FFFFFF",divider:"rgba(255,255,255,0.1)",closeColor:"#FFFFFF",closeHoverBg:"rgba(255,255,255,0.05)",copyColor:"rgba(255,255,255,0.5)",inputBg:"#121212",inputBorder:"rgba(255,255,255,0.1)",hintColor:"rgba(255,255,255,0.5)",primary:"#019D92",primaryGlow:"rgba(1,157,146,0.15)",secondary:"#E70077",onPrimary:"#FFFFFF"}};function ft(s,e){const r=gr[s],t=e==null?void 0:e[s];return t?{...r,...t.primary!==void 0&&{primary:t.primary},...t.secondary!==void 0&&{secondary:t.secondary},...t.onPrimary!==void 0&&{onPrimary:t.onPrimary},...t.borderDefault!==void 0&&{border:t.borderDefault},...t.borderSubtle!==void 0&&{divider:t.borderSubtle,inputBorder:t.borderSubtle},...t.textIconPrimary!==void 0&&{titleColor:t.textIconPrimary,valueColor:t.textIconPrimary,pillAmtColor:t.textIconPrimary,closeColor:t.textIconPrimary},...t.textIconSecondary!==void 0&&{subtitleColor:t.textIconSecondary},...t.textIconTertiary!==void 0&&{labelColor:t.textIconTertiary,pillFromColor:t.textIconTertiary,copyColor:t.textIconTertiary,hintColor:t.textIconTertiary},...t.surfaceDefault!==void 0&&{pillBg:t.surfaceDefault,closeHoverBg:t.surfaceDefault},...t.bg!==void 0&&{bg:t.bg,inputBg:t.bg}}:r}const pr=`
2
+ @import url('https://fonts.googleapis.com/css2?family=Sora:wght@400;600&display=swap');
3
+
4
+ #${te} {
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: 2147483647;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ background: rgba(0,0,0,0.55);
12
+ font-family: 'Sora', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
13
+ animation: __crossx-fade-in 0.15s ease;
14
+ }
15
+ @keyframes __crossx-fade-in {
16
+ from { opacity: 0; }
17
+ to { opacity: 1; }
18
+ }
19
+
20
+ .__crossx-card {
21
+ background: var(--cx-bg);
22
+ border: 4px solid var(--cx-border);
23
+ border-radius: 24px;
24
+ width: 383px;
25
+ max-width: calc(100vw - 32px);
26
+ overflow: hidden;
27
+ position: relative;
28
+ animation: __crossx-slide-up 0.18s ease;
29
+ }
30
+ @keyframes __crossx-slide-up {
31
+ from { transform: translateY(20px); opacity: 0; }
32
+ to { transform: translateY(0); opacity: 1; }
33
+ }
34
+
35
+ /* ── Header ─────────────────────────────────────────────────────── */
36
+ .__crossx-header {
37
+ padding: 24px 24px 20px;
38
+ position: relative;
39
+ }
40
+ .__crossx-title {
41
+ font-size: 22px;
42
+ font-weight: 600;
43
+ line-height: 1.3;
44
+ color: var(--cx-title);
45
+ margin: 0 0 4px 0;
46
+ padding-right: 36px;
47
+ }
48
+ .__crossx-subtitle {
49
+ font-size: 14px;
50
+ font-weight: 400;
51
+ line-height: 1.3;
52
+ color: var(--cx-subtitle);
53
+ margin: 0;
54
+ }
55
+ .__crossx-close {
56
+ position: absolute;
57
+ top: 12px;
58
+ right: 12px;
59
+ width: 32px;
60
+ height: 32px;
61
+ border: none;
62
+ background: none;
63
+ cursor: pointer;
64
+ color: var(--cx-close);
65
+ border-radius: 8px;
66
+ display: flex;
67
+ align-items: center;
68
+ justify-content: center;
69
+ padding: 0;
70
+ appearance: none;
71
+ -webkit-appearance: none;
72
+ box-shadow: none;
73
+ outline: none;
74
+ }
75
+ .__crossx-close:hover,
76
+ .__crossx-close:focus {
77
+ background: none;
78
+ box-shadow: none;
79
+ outline: none;
80
+ filter: none;
81
+ transform: none;
82
+ }
83
+ .__crossx-close svg { display: block; }
84
+
85
+ /* ── Divider ─────────────────────────────────────────────────────── */
86
+ .__crossx-divider {
87
+ border: none;
88
+ border-top: 1px solid var(--cx-divider);
89
+ margin: 0;
90
+ }
91
+
92
+ /* ── Body ────────────────────────────────────────────────────────── */
93
+ .__crossx-body {
94
+ padding: 20px 24px 24px;
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 16px;
98
+ }
99
+
100
+ /* Info rows */
101
+ .__crossx-rows {
102
+ display: flex;
103
+ flex-direction: column;
104
+ gap: 4px;
105
+ }
106
+ .__crossx-row {
107
+ display: flex;
108
+ align-items: center;
109
+ height: 20px;
110
+ }
111
+ .__crossx-row-label {
112
+ font-size: 13px;
113
+ font-weight: 400;
114
+ line-height: 1.3;
115
+ color: var(--cx-label);
116
+ width: 100px;
117
+ flex-shrink: 0;
118
+ }
119
+ .__crossx-row-value {
120
+ font-size: 13px;
121
+ font-weight: 400;
122
+ line-height: 1.3;
123
+ color: var(--cx-value);
124
+ flex: 1;
125
+ text-align: right;
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: flex-end;
129
+ gap: 4px;
130
+ min-width: 0;
131
+ overflow: hidden;
132
+ }
133
+ .__crossx-addr-text {
134
+ white-space: nowrap;
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ }
138
+ .__crossx-copy-btn {
139
+ background: none;
140
+ border: none;
141
+ cursor: pointer;
142
+ color: var(--cx-copy);
143
+ padding: 0;
144
+ display: flex;
145
+ align-items: center;
146
+ flex-shrink: 0;
147
+ opacity: 0.7;
148
+ transition: opacity 0.12s;
149
+ }
150
+ .__crossx-copy-btn:hover { opacity: 1; }
151
+
152
+ /* Amount pill */
153
+ .__crossx-pill {
154
+ background: var(--cx-pill-bg);
155
+ border-radius: 12px;
156
+ padding: 16px;
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 8px;
160
+ }
161
+ .__crossx-pill-from {
162
+ font-size: 16px;
163
+ font-weight: 600;
164
+ line-height: 1.3;
165
+ color: var(--cx-pill-from);
166
+ white-space: nowrap;
167
+ overflow: hidden;
168
+ text-overflow: ellipsis;
169
+ flex-shrink: 1;
170
+ min-width: 0;
171
+ }
172
+ .__crossx-pill-amount {
173
+ font-size: 16px;
174
+ font-weight: 600;
175
+ line-height: 1.3;
176
+ color: var(--cx-pill-amt);
177
+ text-align: right;
178
+ white-space: nowrap;
179
+ flex-shrink: 0;
180
+ margin-left: auto;
181
+ }
182
+
183
+ /* Message box */
184
+ .__crossx-msg-box {
185
+ background: var(--cx-pill-bg);
186
+ border-radius: 12px;
187
+ padding: 16px;
188
+ max-height: 160px;
189
+ overflow-y: auto;
190
+ word-break: break-all;
191
+ font-size: 13px;
192
+ font-weight: 400;
193
+ line-height: 1.5;
194
+ color: var(--cx-value);
195
+ white-space: pre-wrap;
196
+ }
197
+
198
+
199
+ /* ── Migration Found Modal ─────────────────────────────────────── */
200
+ .__crossx-card--migration {
201
+ width: 560px;
202
+ }
203
+ .__crossx-subtitle--body {
204
+ font-size: 16px;
205
+ font-weight: 500;
206
+ line-height: 1.5;
207
+ color: var(--cx-subtitle);
208
+ margin: 0;
209
+ letter-spacing: -0.16px;
210
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
211
+ }
212
+ .__crossx-mig-info {
213
+ display: flex;
214
+ flex-direction: column;
215
+ gap: 4px;
216
+ }
217
+ .__crossx-mig-info-title {
218
+ font-size: 14px;
219
+ font-weight: 600;
220
+ line-height: 1.4;
221
+ color: var(--cx-value);
222
+ margin: 0;
223
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
224
+ }
225
+ .__crossx-mig-info-desc {
226
+ font-size: 14px;
227
+ font-weight: 400;
228
+ line-height: 1.4;
229
+ color: var(--cx-subtitle);
230
+ margin: 0;
231
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
232
+ }
233
+ .__crossx-recover-btn {
234
+ display: flex;
235
+ align-items: center;
236
+ gap: 16px;
237
+ width: 100%;
238
+ padding: 16px;
239
+ background: var(--cx-pill-bg);
240
+ border: 1px solid var(--cx-pill-bg);
241
+ border-radius: 20px;
242
+ cursor: pointer;
243
+ appearance: none;
244
+ -webkit-appearance: none;
245
+ -webkit-tap-highlight-color: transparent;
246
+ box-shadow: none;
247
+ outline: none;
248
+ }
249
+ .__crossx-recover-btn:hover,
250
+ .__crossx-recover-btn:focus {
251
+ background: var(--cx-pill-bg);
252
+ border-color: var(--cx-pill-bg);
253
+ opacity: 1;
254
+ box-shadow: none;
255
+ outline: none;
256
+ filter: none;
257
+ transform: none;
258
+ }
259
+ .__crossx-recover-label {
260
+ font-size: 18px;
261
+ font-weight: 700;
262
+ line-height: 1.3;
263
+ color: var(--cx-value);
264
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
265
+ }
266
+ .__crossx-skip-btn {
267
+ font-size: 16px;
268
+ font-weight: 400;
269
+ line-height: 1.3;
270
+ color: var(--cx-subtitle);
271
+ text-decoration: underline;
272
+ cursor: pointer;
273
+ text-align: center;
274
+ display: block;
275
+ background: none;
276
+ border: none;
277
+ width: 100%;
278
+ font-family: 'Sora', -apple-system, sans-serif;
279
+ padding: 0;
280
+ appearance: none;
281
+ -webkit-appearance: none;
282
+ -webkit-tap-highlight-color: transparent;
283
+ box-shadow: none;
284
+ outline: none;
285
+ }
286
+ .__crossx-skip-btn:hover,
287
+ .__crossx-skip-btn:focus {
288
+ background: none;
289
+ color: var(--cx-subtitle);
290
+ opacity: 1;
291
+ box-shadow: none;
292
+ outline: none;
293
+ filter: none;
294
+ transform: none;
295
+ text-decoration: underline;
296
+ }
297
+
298
+ /* ── PIN Input Modal ───────────────────────────────────────────── */
299
+ .__crossx-pin-center {
300
+ display: flex;
301
+ flex-direction: column;
302
+ align-items: center;
303
+ justify-content: center;
304
+ height: 272px;
305
+ gap: 16px;
306
+ padding: 20px 64px 24px;
307
+ }
308
+ .__crossx-pin-inputs {
309
+ display: flex;
310
+ gap: 16px;
311
+ }
312
+ .__crossx-pin-input {
313
+ width: 72px;
314
+ height: 72px;
315
+ border: 1px solid var(--cx-input-border);
316
+ border-radius: 8px;
317
+ background: var(--cx-input-bg);
318
+ text-align: center;
319
+ font-size: 32px;
320
+ font-weight: 600;
321
+ font-family: 'Sora', sans-serif;
322
+ color: var(--cx-value);
323
+ outline: none;
324
+ transition: border-color 0.15s, box-shadow 0.15s;
325
+ -webkit-text-security: disc;
326
+ }
327
+ .__crossx-pin-input:focus {
328
+ border-color: var(--cx-primary);
329
+ box-shadow: 0 0 0 2px var(--cx-primary-glow);
330
+ }
331
+ .__crossx-pin-input.--error {
332
+ border-color: var(--cx-secondary);
333
+ }
334
+ .__crossx-pin-hint {
335
+ font-size: 16px;
336
+ font-weight: 500;
337
+ line-height: 1.5;
338
+ color: var(--cx-subtitle);
339
+ text-align: center;
340
+ font-family: 'Pretendard', -apple-system, sans-serif;
341
+ letter-spacing: -0.16px;
342
+ margin: 0;
343
+ }
344
+ .__crossx-pin-error-text {
345
+ font-size: 14px;
346
+ font-weight: 500;
347
+ line-height: 1.4;
348
+ color: var(--cx-secondary);
349
+ text-align: center;
350
+ margin: 0;
351
+ }
352
+
353
+ /* ── Signature Request modals (message & typed data) ───────── */
354
+ .__crossx-sig-subtitle {
355
+ font-size: 18px;
356
+ font-weight: 600;
357
+ line-height: 1.3;
358
+ color: var(--cx-title);
359
+ text-align: center;
360
+ margin: 0;
361
+ }
362
+ .__crossx-sig-origin { color: var(--cx-primary); }
363
+ .__crossx-addr-pill {
364
+ background: var(--cx-pill-bg);
365
+ border-radius: 12px;
366
+ padding: 16px;
367
+ display: flex;
368
+ align-items: center;
369
+ justify-content: center;
370
+ gap: 8px;
371
+ color: var(--cx-value);
372
+ }
373
+ .__crossx-addr-pill-text {
374
+ font-size: 18px;
375
+ font-weight: 600;
376
+ line-height: 1.3;
377
+ color: var(--cx-value);
378
+ }
379
+ .__crossx-warning {
380
+ font-size: 14px;
381
+ font-weight: 400;
382
+ line-height: 1.3;
383
+ color: var(--cx-subtitle);
384
+ text-align: center;
385
+ margin: 0;
386
+ }
387
+ .__crossx-msg-raw {
388
+ font-size: 14px;
389
+ font-weight: 400;
390
+ line-height: 1.3;
391
+ color: var(--cx-label);
392
+ white-space: pre-wrap;
393
+ word-break: break-all;
394
+ max-height: 200px;
395
+ overflow-y: auto;
396
+ margin: 0;
397
+ }
398
+ .__crossx-td-rows {
399
+ display: flex;
400
+ flex-direction: column;
401
+ gap: 4px;
402
+ }
403
+ .__crossx-td-row {
404
+ display: flex;
405
+ align-items: center;
406
+ justify-content: space-between;
407
+ min-height: 20px;
408
+ gap: 20px;
409
+ }
410
+ .__crossx-td-label {
411
+ font-size: 13px;
412
+ font-weight: 400;
413
+ line-height: 1.3;
414
+ color: var(--cx-label);
415
+ flex-shrink: 0;
416
+ }
417
+ .__crossx-td-value {
418
+ font-size: 13px;
419
+ font-weight: 400;
420
+ line-height: 1.3;
421
+ color: var(--cx-value);
422
+ text-align: right;
423
+ display: flex;
424
+ align-items: center;
425
+ justify-content: flex-end;
426
+ gap: 4px;
427
+ min-width: 0;
428
+ }
429
+
430
+ /* ── Transaction modals ────────────────────────────────────── */
431
+ .__crossx-tx-subtitle {
432
+ font-size: 14px;
433
+ font-weight: 400;
434
+ line-height: 1.3;
435
+ color: var(--cx-subtitle);
436
+ margin: 0;
437
+ }
438
+ .__crossx-raw-tx {
439
+ background: var(--cx-pill-bg);
440
+ border-radius: 12px;
441
+ padding: 16px;
442
+ font-size: 13px;
443
+ font-weight: 400;
444
+ line-height: 1.6;
445
+ color: var(--cx-label);
446
+ white-space: pre-wrap;
447
+ word-break: break-all;
448
+ max-height: 180px;
449
+ overflow-y: auto;
450
+ margin: 0;
451
+ width: 100%;
452
+ box-sizing: border-box;
453
+ }
454
+ .__crossx-approve-btn {
455
+ width: 100%;
456
+ padding: 16px;
457
+ border: 1px solid rgba(18,18,18,0.05);
458
+ border-radius: 12px;
459
+ background: var(--cx-primary);
460
+ color: var(--cx-on-primary);
461
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
462
+ font-size: 18px;
463
+ font-weight: 700;
464
+ line-height: 1.3;
465
+ cursor: pointer;
466
+ transition: opacity 0.12s, transform 0.1s;
467
+ }
468
+ .__crossx-approve-btn:hover { opacity: 0.9; }
469
+ .__crossx-approve-btn:active { transform: scale(0.98); }
470
+ .__crossx-btn-row {
471
+ display: flex;
472
+ gap: 8px;
473
+ width: 100%;
474
+ }
475
+ .__crossx-cancel-btn {
476
+ flex: 1;
477
+ padding: 16px;
478
+ border: 1px solid var(--cx-primary);
479
+ border-radius: 12px;
480
+ background: none;
481
+ color: var(--cx-primary);
482
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
483
+ font-size: 18px;
484
+ font-weight: 700;
485
+ line-height: 1.3;
486
+ cursor: pointer;
487
+ transition: opacity 0.12s;
488
+ }
489
+ .__crossx-cancel-btn:hover { opacity: 0.8; }
490
+ .__crossx-confirm-btn {
491
+ flex: 1;
492
+ padding: 16px;
493
+ border: 1px solid rgba(18,18,18,0.05);
494
+ border-radius: 12px;
495
+ background: var(--cx-primary);
496
+ color: var(--cx-on-primary);
497
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
498
+ font-size: 18px;
499
+ font-weight: 700;
500
+ line-height: 1.3;
501
+ cursor: pointer;
502
+ transition: opacity 0.12s, transform 0.1s;
503
+ }
504
+ .__crossx-confirm-btn:hover { opacity: 0.9; }
505
+ .__crossx-confirm-btn:active { transform: scale(0.98); }
506
+
507
+ /* ── Transaction Complete Modal ────────────────────────────── */
508
+ .__crossx-complete-body {
509
+ padding: 32px 24px 24px;
510
+ display: flex;
511
+ flex-direction: column;
512
+ align-items: center;
513
+ gap: 20px;
514
+ }
515
+ .__crossx-check-wrap {
516
+ width: 72px;
517
+ height: 72px;
518
+ border-radius: 50%;
519
+ background: var(--cx-primary);
520
+ display: flex;
521
+ align-items: center;
522
+ justify-content: center;
523
+ flex-shrink: 0;
524
+ animation: __crossx-pop-in 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
525
+ }
526
+ @keyframes __crossx-pop-in {
527
+ from { transform: scale(0.5); opacity: 0; }
528
+ to { transform: scale(1); opacity: 1; }
529
+ }
530
+ .__crossx-complete-texts {
531
+ display: flex;
532
+ flex-direction: column;
533
+ align-items: center;
534
+ gap: 6px;
535
+ text-align: center;
536
+ }
537
+ .__crossx-complete-title {
538
+ font-size: 22px;
539
+ font-weight: 700;
540
+ line-height: 1.3;
541
+ color: var(--cx-title);
542
+ margin: 0;
543
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
544
+ }
545
+ .__crossx-complete-subtitle {
546
+ font-size: 14px;
547
+ font-weight: 400;
548
+ line-height: 1.5;
549
+ color: var(--cx-subtitle);
550
+ margin: 0;
551
+ }
552
+ .__crossx-complete-rows {
553
+ width: 100%;
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 4px;
557
+ }
558
+ .__crossx-complete-amount {
559
+ width: 100%;
560
+ background: var(--cx-pill-bg);
561
+ border-radius: 12px;
562
+ padding: 16px;
563
+ font-size: 20px;
564
+ font-weight: 700;
565
+ line-height: 1.3;
566
+ color: var(--cx-title);
567
+ text-align: center;
568
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
569
+ }
570
+ .__crossx-complete-btn-col {
571
+ display: flex;
572
+ flex-direction: column;
573
+ gap: 8px;
574
+ width: 100%;
575
+ }
576
+ .__crossx-explorer-btn {
577
+ width: 100%;
578
+ padding: 16px;
579
+ border: 1px solid var(--cx-primary);
580
+ border-radius: 12px;
581
+ background: none;
582
+ color: var(--cx-primary);
583
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
584
+ font-size: 18px;
585
+ font-weight: 700;
586
+ line-height: 1.3;
587
+ cursor: pointer;
588
+ text-decoration: none;
589
+ display: flex;
590
+ align-items: center;
591
+ justify-content: center;
592
+ gap: 6px;
593
+ transition: opacity 0.12s;
594
+ box-sizing: border-box;
595
+ appearance: none;
596
+ -webkit-appearance: none;
597
+ }
598
+ .__crossx-explorer-btn:hover { opacity: 0.8; }
599
+ .__crossx-done-btn {
600
+ width: 100%;
601
+ padding: 16px;
602
+ border: 1px solid rgba(18,18,18,0.05);
603
+ border-radius: 12px;
604
+ background: var(--cx-primary);
605
+ color: var(--cx-on-primary);
606
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
607
+ font-size: 18px;
608
+ font-weight: 700;
609
+ line-height: 1.3;
610
+ cursor: pointer;
611
+ transition: opacity 0.12s, transform 0.1s;
612
+ appearance: none;
613
+ -webkit-appearance: none;
614
+ }
615
+ .__crossx-done-btn:hover { opacity: 0.9; }
616
+ .__crossx-done-btn:active { transform: scale(0.98); }
617
+
618
+ /* ── Login Selector Modal ──────────────────────────────────── */
619
+ .__crossx-login-btn-row {
620
+ display: flex;
621
+ gap: 8px;
622
+ width: 100%;
623
+ }
624
+ .__crossx-login-btn {
625
+ flex: 1;
626
+ display: flex;
627
+ flex-direction: column;
628
+ gap: 16px;
629
+ padding: 16px;
630
+ background: var(--cx-pill-bg);
631
+ border: 1px solid var(--cx-border);
632
+ border-radius: 20px;
633
+ cursor: pointer;
634
+ align-items: flex-start;
635
+ justify-content: center;
636
+ appearance: none;
637
+ -webkit-appearance: none;
638
+ -webkit-tap-highlight-color: transparent;
639
+ box-shadow: none;
640
+ outline: none;
641
+ transition: opacity 0.12s;
642
+ min-width: 0;
643
+ }
644
+ .__crossx-login-btn:hover { opacity: 0.8; }
645
+ .__crossx-login-btn:focus {
646
+ outline: none;
647
+ box-shadow: none;
648
+ }
649
+ .__crossx-login-btn-label {
650
+ font-size: 18px;
651
+ font-weight: 700;
652
+ line-height: 1.3;
653
+ color: var(--cx-value);
654
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
655
+ text-align: left;
656
+ white-space: nowrap;
657
+ }
658
+ .__crossx-login-icon {
659
+ width: 40px;
660
+ height: 40px;
661
+ flex-shrink: 0;
662
+ display: flex;
663
+ align-items: center;
664
+ justify-content: center;
665
+ }
666
+ .__crossx-login-terms {
667
+ font-size: 12px;
668
+ font-weight: 400;
669
+ line-height: 1.3;
670
+ color: var(--cx-subtitle);
671
+ text-align: center;
672
+ font-family: 'Pretendard', 'Sora', -apple-system, sans-serif;
673
+ margin: 0;
674
+ width: 100%;
675
+ }
676
+ .__crossx-login-terms-link {
677
+ color: var(--cx-primary);
678
+ text-decoration: none;
679
+ }
680
+
681
+ /* ── Mobile bottom sheet ───────────────────────────────────── */
682
+ @media (max-width: 480px) {
683
+ #${te} { align-items: flex-end; }
684
+ .__crossx-card {
685
+ width: 100%;
686
+ max-width: 100%;
687
+ border-radius: 24px 24px 0 0;
688
+ border-bottom: none;
689
+ max-height: 85vh;
690
+ overflow-y: auto;
691
+ animation: __crossx-slide-up-mobile 0.25s ease;
692
+ }
693
+ .__crossx-login-btn-row {
694
+ flex-direction: column;
695
+ }
696
+ .__crossx-login-btn-label {
697
+ white-space: normal;
698
+ }
699
+ }
700
+ @keyframes __crossx-slide-up-mobile {
701
+ from { transform: translateY(100%); }
702
+ to { transform: translateY(0); }
703
+ }
704
+ `;function Se(){let s=document.getElementById(ht);s||(s=document.createElement("style"),s.id=ht,document.head.appendChild(s)),s.textContent=pr}function he(s){return s?s.length<=13?s:`${s.slice(0,6)}…${s.slice(-4)}`:"—"}function xr(s,e="CROSS",r=18){if(!s||s==="0x"||s==="0x0")return null;try{const t=BigInt(s);if(t===0n)return null;const n=10**r,o=Number(t)/n;return o===0?null:`${o.toPrecision(6).replace(/\.?0+$/,"")} ${e}`}catch{return null}}const gt={1:"Ethereum Mainnet",5:"Goerli Testnet",11155111:"Ethereum Sepolia",17e3:"Ethereum Holesky",10:"Optimism",420:"Optimism Goerli",42161:"Arbitrum One",421614:"Arbitrum Sepolia",8453:"Base",84532:"Base Sepolia",137:"Polygon",80002:"Polygon Amoy",56:"BNB Smart Chain",97:"BNB Testnet",43114:"Avalanche C-Chain",43113:"Avalanche Fuji",250:"Fantom Opera",612044:"CROSS Testnet",612055:"CROSS Mainnet"},_r={1:"https://etherscan.io",5:"https://goerli.etherscan.io",11155111:"https://sepolia.etherscan.io",17e3:"https://holesky.etherscan.io",10:"https://optimistic.etherscan.io",420:"https://goerli-optimism.etherscan.io",42161:"https://arbiscan.io",421614:"https://sepolia.arbiscan.io",8453:"https://basescan.org",84532:"https://sepolia.basescan.org",137:"https://polygonscan.com",80002:"https://amoy.polygonscan.com",56:"https://bscscan.com",97:"https://testnet.bscscan.com",43114:"https://snowtrace.io",43113:"https://testnet.snowtrace.io",612044:"https://explorer-testnet.crossx.ai",612055:"https://explorer.crossx.ai"};function mr(s,e){const r=parseInt(s.split(":")[1]??"",10),t=isNaN(r)?void 0:_r[r];return t?`${t}/tx/${e}`:null}function Qe(s){const e=parseInt(s.split(":")[1]??"",10);return!isNaN(e)&&gt[e]?gt[e]:s}function pt(s,e){if(s===0n)return"0";const r=10n**BigInt(e),t=s/r,i=(s%r).toString().padStart(e,"0").slice(0,6).replace(/0+$/,"");return i?`${t}.${i}`:`${t}`}function Lt(s){const{gasLimit:e,gasPrice:r,maxFeePerGas:t,nativeSymbol:n="ETH",nativeDecimals:o=18}=s;if(!e)return"—";try{const i=BigInt(e);if(t){const a=i*BigInt(t);return`${pt(a,o)} ${n}`}if(r){const a=i*BigInt(r);return`${pt(a,o)} ${n}`}return`${i.toLocaleString()} gas`}catch{return e}}const Ie=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
705
+ <rect x="9" y="9" width="13" height="13" rx="2"/>
706
+ <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/>
707
+ </svg>`,fe=`<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round">
708
+ <line x1="18" y1="6" x2="6" y2="18"/>
709
+ <line x1="6" y1="6" x2="18" y2="18"/>
710
+ </svg>`;function wr(s){return`<svg width="28" height="28" viewBox="0 0 28 28" fill="none">
711
+ <circle cx="14" cy="14" r="14" fill="${s}"/>
712
+ <path d="M14 7.5L19.2 10.5V16.5L14 19.5L8.8 16.5V10.5L14 7.5Z" fill="white" opacity="0.9"/>
713
+ </svg>`}const et=`<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
714
+ <rect x="2" y="5" width="16" height="12" rx="2" stroke="currentColor" stroke-width="1.5"/>
715
+ <path d="M2 9h16" stroke="currentColor" stroke-width="1.5"/>
716
+ <rect x="12.5" y="11.5" width="3.5" height="2.5" rx="0.75" fill="currentColor"/>
717
+ </svg>`;function ge(s){return[`--cx-bg:${s.bg}`,`--cx-border:${s.border}`,`--cx-title:${s.titleColor}`,`--cx-subtitle:${s.subtitleColor}`,`--cx-label:${s.labelColor}`,`--cx-value:${s.valueColor}`,`--cx-pill-bg:${s.pillBg}`,`--cx-pill-from:${s.pillFromColor}`,`--cx-pill-amt:${s.pillAmtColor}`,`--cx-divider:${s.divider}`,`--cx-close:${s.closeColor}`,`--cx-close-hover:${s.closeHoverBg}`,`--cx-copy:${s.copyColor}`,`--cx-input-bg:${s.inputBg}`,`--cx-input-border:${s.inputBorder}`,`--cx-hint:${s.hintColor}`,`--cx-primary:${s.primary}`,`--cx-primary-glow:${s.primaryGlow}`,`--cx-secondary:${s.secondary}`,`--cx-on-primary:${s.onPrimary}`].join(";")}function oe(s,e){return`
718
+ <div class="__crossx-row">
719
+ <span class="__crossx-row-label">${s}</span>
720
+ <div class="__crossx-row-value">${e}</div>
721
+ </div>`}function yr(s,e){const r=e,t=Fe(),n=s.to?`<span class="__crossx-addr-text">${he(s.to)}</span>
722
+ <button class="__crossx-copy-btn" data-copy="${s.to}" title="Copy address">${Ie}</button>`:"<span>—</span>",o=`<span>${Lt(s)}</span>`,i=s.data&&s.data!=="0x"?s.data:"0x",a=document.createElement("div");return a.id=te,a.innerHTML=`
723
+ <div class="__crossx-card __crossx-card--migration" style="${ge(r)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
724
+ <div class="__crossx-header">
725
+ <p class="__crossx-title" id="__crossx-ttl">Signature Request</p>
726
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
727
+ </div>
728
+ <hr class="__crossx-divider">
729
+ <div class="__crossx-body">
730
+ <p class="__crossx-sig-subtitle">
731
+ <span class="__crossx-sig-origin">${X(t)} </span>is requesting a Signature
732
+ </p>
733
+ <div class="__crossx-addr-pill">
734
+ ${et}
735
+ <span class="__crossx-addr-pill-text">${he(s.from)}</span>
736
+ </div>
737
+ <p class="__crossx-warning">After you sign, changes or cancellations are not possible.</p>
738
+ <hr class="__crossx-divider">
739
+ <div class="__crossx-rows">
740
+ ${oe("To",n)}
741
+ ${oe("Network",`<span>${Qe(s.chainId)}</span>`)}
742
+ ${oe("Estimated fee",o)}
743
+ </div>
744
+ <pre class="__crossx-raw-tx">${X(i)}</pre>
745
+ <div class="__crossx-btn-row">
746
+ <button class="__crossx-cancel-btn" id="__crossx-cancel-btn">Cancel</button>
747
+ <button class="__crossx-confirm-btn" id="__crossx-confirm-btn">Sign</button>
748
+ </div>
749
+ </div>
750
+ </div>
751
+ `,a}function br(s,e){const r=e,t=s.nativeSymbol??"ETH",n=s.nativeDecimals??18,o=Fe(),i=s.to?`<span class="__crossx-addr-text">${he(s.to)}</span>
752
+ <button class="__crossx-copy-btn" data-copy="${s.to}" title="Copy address">${Ie}</button>`:"<span>—</span>",a=`<span>${Lt(s)}</span>`,l=xr(s.value,t,n)??(s.data&&s.data!=="0x"?"Contract Call":`0 ${t}`),d=document.createElement("div");return d.id=te,d.innerHTML=`
753
+ <div class="__crossx-card __crossx-card--migration" style="${ge(r)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
754
+ <div class="__crossx-header">
755
+ <p class="__crossx-title" id="__crossx-ttl">Approve transaction</p>
756
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
757
+ </div>
758
+ <hr class="__crossx-divider">
759
+ <div class="__crossx-body">
760
+ <p class="__crossx-tx-subtitle">
761
+ <span class="__crossx-sig-origin">${X(o)}</span> wants your permission to approve the following transaction.
762
+ </p>
763
+ <div class="__crossx-rows">
764
+ ${oe("To",i)}
765
+ ${oe("Network",`<span>${Qe(s.chainId)}</span>`)}
766
+ ${oe("Estimated fee",a)}
767
+ </div>
768
+ <div class="__crossx-pill">
769
+ <span class="__crossx-pill-from">${he(s.from)}</span>
770
+ <span class="__crossx-pill-amount">${l}</span>
771
+ </div>
772
+ <button class="__crossx-approve-btn" id="__crossx-confirm-btn">Approve</button>
773
+ </div>
774
+ </div>
775
+ `,d}function Fe(){var s;try{return((s=window.location)==null?void 0:s.hostname)||"This site"}catch{return"This site"}}function X(s){return s.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function vr(s){return typeof s=="string"&&/^0x[0-9a-fA-F]{40}$/i.test(s)}function Er(s){if(typeof s=="string")return X(s);if(typeof s=="number"||typeof s=="bigint"||typeof s=="boolean")return String(s);try{return X(JSON.stringify(s))}catch{return String(s)}}const Sr=`<svg width="36" height="36" viewBox="0 0 36 36" fill="none">
776
+ <path d="M8 18L15 25L28 11" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/>
777
+ </svg>`,Tr=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
778
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
779
+ <polyline points="15 3 21 3 21 9"/>
780
+ <line x1="10" y1="14" x2="21" y2="3"/>
781
+ </svg>`;function Ir(s,e){const r=mr(s.chainId,s.txHash),t=Qe(s.chainId),n=`${s.txHash.slice(0,10)}…${s.txHash.slice(-8)}`,o=r?`<a class="__crossx-explorer-btn" id="__crossx-explorer-btn" href="${r}" target="_blank" rel="noopener noreferrer">
782
+ ${Tr} View on Explorer
783
+ </a>`:"",i=s.amount?`<div class="__crossx-complete-amount">${X(s.amount)}</div>`:"",a=s.to?oe("To",`<span class="__crossx-addr-text">${he(s.to)}</span>
784
+ <button class="__crossx-copy-btn" data-copy="${s.to}" title="Copy address">${Ie}</button>`):"",c=document.createElement("div");return c.id=te,c.innerHTML=`
785
+ <div class="__crossx-card __crossx-card--migration" style="${ge(e)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
786
+ <div class="__crossx-header">
787
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
788
+ </div>
789
+ <div class="__crossx-complete-body">
790
+ <div class="__crossx-check-wrap">${Sr}</div>
791
+ <div class="__crossx-complete-texts">
792
+ <p class="__crossx-complete-title" id="__crossx-ttl">Transaction Sent</p>
793
+ <p class="__crossx-complete-subtitle">Your transaction has been submitted to the network.</p>
794
+ </div>
795
+ ${i}
796
+ <div class="__crossx-complete-rows">
797
+ ${a}
798
+ ${oe("Network",`<span>${X(t)}</span>`)}
799
+ ${oe("Tx Hash",`<span class="__crossx-addr-text">${X(n)}</span>
800
+ <button class="__crossx-copy-btn" data-copy="${s.txHash}" title="Copy tx hash">${Ie}</button>`)}
801
+ </div>
802
+ <div class="__crossx-complete-btn-col">
803
+ ${o}
804
+ <button class="__crossx-done-btn" id="__crossx-done-btn">Done</button>
805
+ </div>
806
+ </div>
807
+ </div>
808
+ `,c}function Ar(s,e){const r=e,t=Fe(),n=X(s.message),o=document.createElement("div");return o.id=te,o.innerHTML=`
809
+ <div class="__crossx-card __crossx-card--migration" style="${ge(r)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
810
+ <div class="__crossx-header">
811
+ <p class="__crossx-title" id="__crossx-ttl">Signature Request</p>
812
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
813
+ </div>
814
+ <hr class="__crossx-divider">
815
+ <div class="__crossx-body">
816
+ <p class="__crossx-sig-subtitle">
817
+ <span class="__crossx-sig-origin">${X(t)} </span>is requesting a Signature
818
+ </p>
819
+ <div class="__crossx-addr-pill">
820
+ ${et}
821
+ <span class="__crossx-addr-pill-text">${he(s.from)}</span>
822
+ </div>
823
+ <p class="__crossx-warning">After you sign, changes or cancellations are not possible.</p>
824
+ <hr class="__crossx-divider">
825
+ <div class="__crossx-msg-raw">${n}</div>
826
+ <div class="__crossx-btn-row">
827
+ <button class="__crossx-cancel-btn" id="__crossx-cancel-btn">Cancel</button>
828
+ <button class="__crossx-confirm-btn" id="__crossx-confirm-btn">Confirm</button>
829
+ </div>
830
+ </div>
831
+ </div>
832
+ `,o}function Rr(s,e){const r=e,t=Fe();let n={};if(typeof s.typedData=="string")try{n=JSON.parse(s.typedData)}catch{}else s.typedData&&typeof s.typedData=="object"&&(n=s.typedData);const o=n.primaryType??"—",i=n.message??{};let a=`
833
+ <div class="__crossx-td-row">
834
+ <span class="__crossx-td-label">Primary Type</span>
835
+ <span class="__crossx-td-value">${X(o)}</span>
836
+ </div>`;for(const[l,d]of Object.entries(i)){const f=Er(d),_=vr(d)?`<span class="__crossx-addr-text">${he(d)}</span>
837
+ <button class="__crossx-copy-btn" data-copy="${d}" title="Copy">${Ie}</button>`:`<span>${f}</span>`;a+=`
838
+ <div class="__crossx-td-row">
839
+ <span class="__crossx-td-label">${X(l)}</span>
840
+ <div class="__crossx-td-value">${_}</div>
841
+ </div>`}const c=document.createElement("div");return c.id=te,c.innerHTML=`
842
+ <div class="__crossx-card __crossx-card--migration" style="${ge(r)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
843
+ <div class="__crossx-header">
844
+ <p class="__crossx-title" id="__crossx-ttl">Signature Request</p>
845
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
846
+ </div>
847
+ <hr class="__crossx-divider">
848
+ <div class="__crossx-body">
849
+ <p class="__crossx-sig-subtitle">
850
+ <span class="__crossx-sig-origin">${X(t)} </span>is requesting a Signature
851
+ </p>
852
+ <div class="__crossx-addr-pill">
853
+ ${et}
854
+ <span class="__crossx-addr-pill-text">${he(s.from)}</span>
855
+ </div>
856
+ <p class="__crossx-warning">After you sign, changes or cancellations are not possible.</p>
857
+ <hr class="__crossx-divider">
858
+ <div class="__crossx-td-rows">${a}</div>
859
+ <div class="__crossx-btn-row">
860
+ <button class="__crossx-cancel-btn" id="__crossx-cancel-btn">Cancel</button>
861
+ <button class="__crossx-confirm-btn" id="__crossx-confirm-btn">Confirm</button>
862
+ </div>
863
+ </div>
864
+ </div>
865
+ `,c}const Or=`<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
866
+ <path d="M26.693 21.193c-.028-3.168 2.587-4.712 2.706-4.786-1.477-2.16-3.77-2.454-4.58-2.484-1.944-.197-3.804 1.148-4.793 1.148-.992 0-2.52-1.12-4.147-1.09-2.13.032-4.1 1.239-5.198 3.133-2.222 3.855-.569 9.562 1.593 12.69 1.061 1.535 2.318 3.258 3.975 3.196 1.6-.064 2.2-1.03 4.133-1.03 1.928 0 2.48 1.03 4.172.997 1.72-.03 2.806-1.56 3.862-3.1 1.211-1.779 1.713-3.495 1.74-3.583-.037-.017-3.427-1.316-3.463-5.09z" fill="currentColor"/>
867
+ <path d="M23.527 11.876c.877-1.065 1.471-2.545 1.31-4.024-1.266.053-2.807.845-3.718 1.907-.813.946-1.53 2.468-1.34 3.915 1.41.107 2.852-.716 3.748-1.798z" fill="currentColor"/>
868
+ </svg>`,Nr=`<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
869
+ <path d="M38.06 20.44c0-1.34-.12-2.63-.34-3.87H20.5v7.32h9.84c-.42 2.28-1.71 4.21-3.65 5.51v4.57h5.91c3.46-3.19 5.46-7.88 5.46-13.53z" fill="#4285F4"/>
870
+ <path d="M20.5 38.5c4.94 0 9.09-1.64 12.12-4.44l-5.91-4.57c-1.64 1.1-3.73 1.75-6.21 1.75-4.77 0-8.82-3.22-10.26-7.55H4.16v4.72A18.49 18.49 0 0 0 20.5 38.5z" fill="#34A853"/>
871
+ <path d="M10.24 23.69A11.16 11.16 0 0 1 9.66 20c0-1.28.22-2.52.58-3.69v-4.72H4.16A18.49 18.49 0 0 0 2 20c0 2.97.71 5.78 1.97 8.28l6.27-4.59z" fill="#FBBC05"/>
872
+ <path d="M20.5 8.76c2.69 0 5.1.92 7 2.73l5.24-5.24C29.58 3.36 25.43 1.5 20.5 1.5A18.49 18.49 0 0 0 4.16 11.59l6.08 4.72C11.68 11.98 15.73 8.76 20.5 8.76z" fill="#EA4335"/>
873
+ </svg>`;function kr(s){const e=s,r=document.createElement("div");return r.id=te,r.innerHTML=`
874
+ <div class="__crossx-card __crossx-card--migration" style="${ge(e)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
875
+ <div class="__crossx-header">
876
+ <div style="display:flex;flex-direction:column;gap:4px;padding-right:36px;">
877
+ <p class="__crossx-title" id="__crossx-ttl" style="padding-right:0;">Welcome onboard</p>
878
+ <p class="__crossx-subtitle">Creating CROSSx Embedded Wallet</p>
879
+ </div>
880
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
881
+ </div>
882
+ <hr class="__crossx-divider">
883
+ <div class="__crossx-body">
884
+ <div class="__crossx-login-btn-row">
885
+ <button class="__crossx-login-btn" id="__crossx-apple-btn" type="button">
886
+ <span class="__crossx-login-icon" style="color:var(--cx-value);">${Or}</span>
887
+ <span class="__crossx-login-btn-label">Sign in with&nbsp;&nbsp;Apple</span>
888
+ </button>
889
+ <button class="__crossx-login-btn" id="__crossx-google-btn" type="button">
890
+ <span class="__crossx-login-icon">${Nr}</span>
891
+ <span class="__crossx-login-btn-label">Sign in with&nbsp;&nbsp;Google</span>
892
+ </button>
893
+ </div>
894
+ <hr class="__crossx-divider">
895
+ <p class="__crossx-login-terms">
896
+ By continuing, you agree to NEXUS&nbsp;<a class="__crossx-login-terms-link" href="#" tabindex="-1">Terms of Service</a>&nbsp;and consent to its&nbsp;<a class="__crossx-login-terms-link" href="#" tabindex="-1">Privacy Policy.</a>
897
+ </p>
898
+ </div>
899
+ </div>
900
+ `,r}function Cr(s){const e=s,r=document.createElement("div");return r.id=te,r.innerHTML=`
901
+ <div class="__crossx-card __crossx-card--migration" style="${ge(e)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
902
+ <div class="__crossx-header">
903
+ <p class="__crossx-title" id="__crossx-ttl">Wallet Found on Social Account 🎉</p>
904
+ <p class="__crossx-subtitle--body">We found a wallet linked to your social account. Enter your 4-digit PIN to restore your assets.</p>
905
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
906
+ </div>
907
+ <hr class="__crossx-divider">
908
+ <div class="__crossx-body">
909
+ <div class="__crossx-mig-info">
910
+ <p class="__crossx-mig-info-title">What is a Recovery Wallet?</p>
911
+ <p class="__crossx-mig-info-desc">It safely restores and integrates all your previous assets. Simply verify your PIN to get started.</p>
912
+ </div>
913
+ <button class="__crossx-recover-btn" id="__crossx-recover-btn">
914
+ <span>${wr(e.primary)}</span>
915
+ <span class="__crossx-recover-label">Recover My Wallet</span>
916
+ </button>
917
+ <button class="__crossx-skip-btn" id="__crossx-skip-btn">Skip for Now</button>
918
+ </div>
919
+ </div>
920
+ `,r}function Pr(s,e){const r=s,t=e?`<p class="__crossx-pin-error-text">${e}</p>`:"",n=document.createElement("div");return n.id=te,n.innerHTML=`
921
+ <div class="__crossx-card __crossx-card--migration" style="${ge(r)}" role="dialog" aria-modal="true" aria-labelledby="__crossx-ttl">
922
+ <div class="__crossx-header">
923
+ <p class="__crossx-title" id="__crossx-ttl">Recover My Wallet</p>
924
+ <button class="__crossx-close" id="__crossx-close-btn" aria-label="Close">${fe}</button>
925
+ </div>
926
+ <hr class="__crossx-divider">
927
+ <div class="__crossx-pin-center">
928
+ <div class="__crossx-pin-inputs">
929
+ <input class="__crossx-pin-input" type="tel" maxlength="1" inputmode="numeric" pattern="[0-9]" autocomplete="off">
930
+ <input class="__crossx-pin-input" type="tel" maxlength="1" inputmode="numeric" pattern="[0-9]" autocomplete="off">
931
+ <input class="__crossx-pin-input" type="tel" maxlength="1" inputmode="numeric" pattern="[0-9]" autocomplete="off">
932
+ <input class="__crossx-pin-input" type="tel" maxlength="1" inputmode="numeric" pattern="[0-9]" autocomplete="off">
933
+ </div>
934
+ <p class="__crossx-pin-hint">Enter your 4-digit PIN to recover your wallet.</p>
935
+ ${t}
936
+ </div>
937
+ </div>
938
+ `,n}function Lr(s,e,r){var n;const t=s.querySelectorAll(".__crossx-pin-input");t.forEach((o,i)=>{o.addEventListener("input",()=>{const a=o.value.replace(/\D/g,"");o.value=a?a[0]:"",a&&i<3&&t[i+1].focus();const c=Array.from(t).map(l=>l.value).join("");c.length===4&&setTimeout(()=>e(c),200)}),o.addEventListener("keydown",a=>{a.key==="Backspace"&&!o.value&&i>0&&(t[i-1].focus(),t[i-1].value=""),a.key==="Escape"&&r()}),o.addEventListener("keypress",a=>{/[0-9]/.test(a.key)||a.preventDefault()}),o.addEventListener("paste",a=>{var d;a.preventDefault();const c=(((d=a.clipboardData)==null?void 0:d.getData("text"))??"").replace(/\D/g,"").slice(0,4);if(!c)return;c.split("").forEach((f,y)=>{t[y]&&(t[y].value=f)});const l=Math.min(c.length,3);t[l].focus(),c.length===4&&setTimeout(()=>e(c),200)})}),(n=t[0])==null||n.focus()}class Br{constructor(e="light",r){this.theme=e,this.overrides=r,this.tokens=ft(e,r)}setTheme(e,r){this.theme=e,r!==void 0&&(this.overrides=r),this.tokens=ft(e,this.overrides)}getTheme(){return this.theme}showLoginSelector(){return new Promise(e=>{var a,c,l;Se();const r=kr(this.tokens);document.body.appendChild(r);const t=()=>r.remove(),n=d=>{t(),e(d)},o=()=>{t(),e(null)};(a=r.querySelector("#__crossx-apple-btn"))==null||a.addEventListener("click",()=>n("apple")),(c=r.querySelector("#__crossx-google-btn"))==null||c.addEventListener("click",()=>n("google")),(l=r.querySelector("#__crossx-close-btn"))==null||l.addEventListener("click",o),r.addEventListener("click",d=>{d.target===r&&o()}),r.querySelectorAll(".__crossx-login-terms-link").forEach(d=>{d.addEventListener("click",f=>f.preventDefault())});const i=d=>{d.key==="Escape"&&(document.removeEventListener("keydown",i),o())};document.addEventListener("keydown",i)})}showMigrationFoundPrompt(){return new Promise(e=>{var a,c,l;Se();const r=Cr(this.tokens);document.body.appendChild(r);const t=()=>r.remove(),n=()=>{t(),e("recover")},o=()=>{t(),e("skip")};(a=r.querySelector("#__crossx-recover-btn"))==null||a.addEventListener("click",n),(c=r.querySelector("#__crossx-skip-btn"))==null||c.addEventListener("click",o),(l=r.querySelector("#__crossx-close-btn"))==null||l.addEventListener("click",o),r.addEventListener("click",d=>{d.target===r&&o()});const i=d=>{d.key==="Escape"&&(document.removeEventListener("keydown",i),o())};document.addEventListener("keydown",i)})}showPinInputPrompt(e){return new Promise(r=>{var a;Se();const t=Pr(this.tokens,e);document.body.appendChild(t);const n=()=>t.remove(),o=c=>{n(),r(c)},i=()=>{n(),r(null)};Lr(t,o,i),(a=t.querySelector("#__crossx-close-btn"))==null||a.addEventListener("click",i),t.addEventListener("click",c=>{c.target===t&&i()})})}showTransactionComplete(e){return new Promise(r=>{var a,c;Se();const t=Ir(e,this.tokens);document.body.appendChild(t);const n=()=>t.remove(),o=()=>{n(),r()};(a=t.querySelector("#__crossx-done-btn"))==null||a.addEventListener("click",o),(c=t.querySelector("#__crossx-close-btn"))==null||c.addEventListener("click",o),t.querySelectorAll(".__crossx-copy-btn").forEach(l=>{l.addEventListener("click",d=>{var y;d.stopPropagation();const f=l.dataset.copy;f&&((y=navigator.clipboard)==null||y.writeText(f).catch(()=>{}))})}),t.addEventListener("click",l=>{l.target===t&&o()});const i=l=>{l.key==="Escape"&&(document.removeEventListener("keydown",i),o())};document.addEventListener("keydown",i)})}requestConfirmation(e){return new Promise(r=>{var c,l,d;Se();let t;e.type==="sign-message"?t=Ar(e,this.tokens):e.type==="sign-typed-data"?t=Rr(e,this.tokens):e.type==="sign"?t=yr(e,this.tokens):t=br(e,this.tokens),document.body.appendChild(t);const n=()=>t.remove(),o=()=>{n(),r(!0)},i=()=>{n(),r(!1)};(c=t.querySelector("#__crossx-confirm-btn"))==null||c.addEventListener("click",o),(l=t.querySelector("#__crossx-cancel-btn"))==null||l.addEventListener("click",i),(d=t.querySelector("#__crossx-close-btn"))==null||d.addEventListener("click",i),t.querySelectorAll(".__crossx-copy-btn").forEach(f=>{f.addEventListener("click",y=>{var E;y.stopPropagation();const _=f.dataset.copy;_&&((E=navigator.clipboard)==null||E.writeText(_).catch(()=>{}))})}),t.addEventListener("click",f=>{f.target===t&&i()});const a=f=>{f.key==="Escape"&&(document.removeEventListener("keydown",a),i())};document.addEventListener("keydown",a)})}}let xe=null;function xt(s){xe=s}const g={log(...s){if(xe){xe.log(...s);return}},warn(...s){if(xe){xe.warn(...s);return}},error(...s){if(xe){xe.error(...s);return}}},We="crossx_access_token",Oe="crossx_refresh_token",Ne="crossx_user_info";class $r{constructor(e,r,t,n,o,i,a){this.config=e,this.storage=r,this.crypto=t,this.oauth=n,this.transport=o,this.walletProvider=i,this.tokenStore=a,this._refreshPromise=null}async execute(e){var o,i,a,c;let r,t,n=!1;try{const l=e==null?void 0:e.provider;let d="/login";l==="google"?d="/google":l==="apple"&&(d="/apple");const f=this.config.oauthServiceUrl,y=`${f}${d}`;g.log(`[CROSSx] OAuth 팝업 열기 (${l||"일반"} 로그인):`,y);const _=await this.oauth.openAuth({authUrl:y,expectedOrigin:new URL(f).origin});g.log("[CROSSx] OAuth Firebase 토큰 받음 (length:",_.length,")");const E=this.config.authApiUrl,{accessToken:O,refreshToken:S}=await this.exchangeFirebaseToken(_,E);g.log("[CROSSx] CROSSx access_token 교환 성공"),r=this.crypto.decodeJWT(O),g.log("[CROSSx] access_token 디코딩 — sub:",r.sub,"exp:",r.exp);const C=await this.crypto.verifyJWT(O);if(n=C.signatureVerified??!1,g.log("[CROSSx] access_token 검증 결과:",C.valid),!C.valid)throw g.error("[CROSSx] access_token 검증 실패"),new Error("Invalid access token");const U=C.payload;let F,B;try{const q=this.crypto.decodeJWT(_);B=(o=q==null?void 0:q.firebase)==null?void 0:o.sign_in_provider;const z=((i=q==null?void 0:q.firebase)==null?void 0:i.identities)??{};B==="google.com"?F=(a=z["google.com"])==null?void 0:a[0]:B==="apple.com"&&(F=(c=z["apple.com"])==null?void 0:c[0]),g.log("[CROSSx] OAuth provider sub 추출 — provider:",B,"hasProviderSub:",!!F)}catch{g.warn("[CROSSx] firebaseToken에서 providerSub 추출 실패, fallback으로 sub 사용")}t={id:U.sub,email:U.email,...U,...B?{signInProvider:B}:{},...F?{providerSub:F}:{}},g.log("[CROSSx] 사용자 정보 — id:",t.id),this.tokenStore.set(O),await this.storage.set(We,O),S&&await this.storage.set(Oe,S),await this.storage.set(Ne,t),g.log("[CROSSx] 토큰 및 사용자 정보 저장 완료")}catch(l){return g.error("[CROSSx] SignIn 에러 (OAuth/토큰 교환 단계):",l),{success:!1,error:l instanceof Error?l.message:"Sign in failed"}}return g.log("[CROSSx][Migration Phase 1] OAuth 로그인 완료, 지갑 로드 시작 — userId:",t.id),this.loadWallet(t,n)}async exchangeFirebaseToken(e,r){const t=`${r}/cross-auth/social/login`;g.log("[CROSSx] Firebase 토큰 교환 요청:",t);const n=await this.transport.request({url:t,method:"POST",headers:{"Content-Type":"application/json"},body:{auth_code:e,login_type:"firebase"}});g.log("[CROSSx] 토큰 교환 응답 — status:",n.status);const o=n.data;if(o!=null&&o.code&&o.code!==200&&o.code>0)throw new m(p.AUTH_FAILED,`Token exchange failed (code ${o.code}): ${o.message}`);const i=(o==null?void 0:o.data)??o,a=i==null?void 0:i.access_token,c=i==null?void 0:i.refresh_token;if(!a)throw g.error("[CROSSx] 교환 응답에서 access_token을 찾을 수 없음:",n),new m(p.AUTH_FAILED,"access_token not found in exchange response");return{accessToken:a,refreshToken:c}}async restoreSession(){try{const e=this.tokenStore.get();if(e){const o=await this.crypto.verifyJWT(e);if(o.valid){const i=await this.storage.get(Ne);if(i)return g.log("[CROSSx] restoreSession — 메모리 토큰 유효, 세션 복원"),this.loadWallet(i,o.signatureVerified)}this.tokenStore.clear()}const r=await this.storage.get(Oe);if(!r)return g.log("[CROSSx] restoreSession — refresh_token 없음, 세션 복원 생략"),null;g.log("[CROSSx] restoreSession — refresh_token 발견, silentRefresh 시도");const t=await this.silentRefresh(r);this.tokenStore.set(t);const n=await this.storage.get(Ne);return n?(g.log("[CROSSx] restoreSession — silentRefresh 성공, 세션 복원 — userId:",n.id),this.loadWallet(n,!1)):null}catch(e){return g.log("[CROSSx] restoreSession — 세션 복원 실패, 스토리지 정리:",e),this.tokenStore.clear(),await this.storage.remove(Oe),await this.storage.remove(Ne),null}}silentRefresh(e){return this._refreshPromise?this._refreshPromise:(this._refreshPromise=this._doSilentRefresh(e).finally(()=>{this._refreshPromise=null}),this._refreshPromise)}async _doSilentRefresh(e){const t=`${this.config.authApiUrl}/cross-auth/social/refresh`,n=this.tokenStore.get()??await this.storage.get(We)??"",o={refresh_token:e,access_token:n},i=await this.transport.request({url:t,method:"POST",headers:{"Content-Type":"application/json"},body:o});g.log("[CROSSx] silentRefresh 응답 — status:",i.status);const a=i.data;if(a!=null&&a.code&&a.code!==200&&a.code>0)throw new m(p.AUTH_FAILED,`Silent refresh failed (code ${a.code}): ${a.message}`);const c=(a==null?void 0:a.data)??a,l=c==null?void 0:c.token,d=c==null?void 0:c.refresh;if(!l)throw new m(p.AUTH_FAILED,"Silent refresh failed: no token in response");return this.tokenStore.set(l),await this.storage.set(We,l),d&&await this.storage.set(Oe,d),g.log("[CROSSx] silentRefresh 성공"),l}async loadWallet(e,r){let t,n=!1;try{g.log("[CROSSx][Migration Phase 2] POST /mnemonic/create 호출 — userId:",e.id),t=(await this.walletProvider.getOrCreateWallet(e.id)).address,g.log("[CROSSx][Migration Phase 2] 지갑 로드 완료 (기존 백업 없음) — address:",t)}catch(o){o instanceof m&&o.code===p.MIGRATION_BACKUP_EXISTS?(g.log("[CROSSx][Migration Phase 2] Gateway -10012 감지 → needsMigration = true"),n=!0):g.warn("[CROSSx][Migration Phase 2] 지갑 로드 실패 (로그인은 유지):",o)}return g.log("[CROSSx][Migration Phase 2] loadWallet 결과 — address:",t,"needsMigration:",n),{success:!0,address:t,user:e,needsMigration:n,tokenSignatureVerified:r}}}const Mr="crossx_access_token",Dr="crossx_refresh_token",Ur="crossx_user_info";class Hr{constructor(e,r){this.storage=e,this.tokenStore=r}async execute(){this.tokenStore.clear(),await this.storage.remove(Mr),await this.storage.remove(Dr),await this.storage.remove(Ur)}}const Fr="crossx_access_token",qr="crossx_refresh_token",Gr="crossx_user_info",Wr="I agree to delete my data";class Vr{constructor(e,r,t){this.storage=e,this.walletProvider=r,this.tokenStore=t}async execute(){if(!this.tokenStore.has())throw new m(p.AUTH_NOT_AUTHENTICATED,"인증되지 않은 상태입니다");if(g.log("[CROSSx] 계정 탈퇴 처리 시작"),!this.walletProvider.withdraw)throw new m(p.NOT_IMPLEMENTED,"현재 환경에서는 탈퇴 기능을 지원하지 않습니다");await this.walletProvider.withdraw(Wr),this.tokenStore.clear(),await this.storage.remove(Fr),await this.storage.remove(qr),await this.storage.remove(Gr),g.log("[CROSSx] 탈퇴 완료")}}class Kr{constructor(e,r){this.storage=e,this.walletProvider=r}async execute(e,r){if(!this.walletProvider.migrateWallet)throw new m(p.NOT_IMPLEMENTED,"Migration is not supported in the current environment");g.log("[CROSSx][Migration Phase 4] MigrateWalletUseCase.execute() — pin 길이:",e.length,"sub:",r);const t=await this.walletProvider.migrateWallet(e,r);return g.log("[CROSSx][Migration Phase 5] MigrateWalletUseCase 완료 — address:",t.address),{address:t.address}}}const se=class se{constructor(e,r,t,n,o,i,a){this.storage=r,this.crypto=t,this.transport=n,this.oauth=o,this.walletProvider=i,this.initialized=!1,this.authenticated=!1,this.userId=null,this.address=null,this.userEmail=null,this.loginType=null,this.providerSub=null,this.tokenSignatureVerified=!1,this._config=Object.freeze({...e}),e.logger&&xt(e.logger),this.confirmation=new Br(e.theme??"light",e.themeTokens),this.signInUseCase=new $r(e,r,t,o,n,i,a),this.signOutUseCase=new Hr(r,a),this.withdrawUseCase=new Vr(r,i,a),this.migrateWalletUseCase=new Kr(r,i)}get config(){return this._config}async initialize(){if(this.initialized)return this.authenticated?{success:!0,address:this.address??void 0}:null;console.log("[CROSSx SDK] v0.1.0 initializing...");try{const e=await this.signInUseCase.restoreSession();return e!=null&&e.success&&this.applyAuthResult(e),this.initialized=!0,e??null}catch(e){throw new m(p.AUTH_NOT_INITIALIZED,"SDK initialization failed",e)}}async signIn(e){this.ensureInitialized();let r=e;if(!(e!=null&&e.provider)){const t=await this.confirmation.showLoginSelector();if(t===null)return{success:!1,error:"User cancelled login"};r={...e,provider:t}}try{const t=await this.signInUseCase.execute(r);return t.success&&this.applyAuthResult(t),t}catch(t){throw new m(p.AUTH_FAILED,"Sign in failed",t)}}async signOut(){this.ensureInitialized();try{await this.signOutUseCase.execute(),this.clearAuthState()}catch(e){throw new m(p.UNKNOWN_ERROR,"Sign out failed",e)}}async withdraw(){this.ensureAuthenticated(),await this.withdrawUseCase.execute(),this.clearAuthState()}isAuthenticated(){return this.authenticated}isLoggedIn(){return this.isAuthenticated()}async ensureLoggedIn(){if(!this.initialized)return!1;if(this.authenticated)return!0;try{const e=await this.signInUseCase.restoreSession();return e!=null&&e.success?(this.applyAuthResult(e),!0):!1}catch{return!1}}async getUserInfo(){return this.ensureAuthenticated(),{id:this.userId,email:this.userEmail??void 0,loginType:this.loginType??void 0,addresses:this.address?[this.address]:[],tokenSignatureVerified:this.tokenSignatureVerified}}async migrateWallet(e){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");try{const r=await this.migrateWalletUseCase.execute(e,this.userId);return this.address=r.address,g.log("[CROSSx] migrateWallet 완료 — address:",r.address),r}catch(r){throw r instanceof m?r:new m(p.MIGRATION_FAILED,"Wallet migration failed",r)}}async getAddress(e){if(e!==void 0){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");return{address:(await this.walletProvider.getAddress(this.userId,e)).address,index:e}}return!this.authenticated||!this.address?null:{address:this.address,index:0}}async getAddresses(){return this.ensureAuthenticated(),this.address?[{address:this.address,index:0}]:[]}applyTheme(e=this._config.theme??"light",r=this._config.themeTokens??{}){this._config=Object.freeze({...this._config,theme:e,themeTokens:r}),this.confirmation.setTheme(e,r)}async createWallet(){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");g.log("[CROSSx] 지갑 생성 시작");try{const e=await this.walletProvider.getOrCreateWallet(this.userId);return this.address=e.address,g.log("[CROSSx] 지갑 생성 완료:",e.address),{address:e.address}}catch(e){if(e instanceof m&&e.code===p.MIGRATION_BACKUP_EXISTS){const r=this.providerSub??this.userId;g.log("[CROSSx][Migration Phase 3] createWallet() — Gateway -10012 감지, 마이그레이션 UI 시작 — migrationSub:",r);const t=await this.handleMigrationFlow(r);if(t)return this.address=t.address,{address:t.address};throw new m(p.MIGRATION_FAILED,"Migration skipped by user")}throw e}}async signMessage(e,r,t){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");const n=t==null?void 0:t.index,o=await this.walletProvider.getAddress(this.userId,n??0);let i;if(this.walletProvider.prepare&&(i=(await this.walletProvider.prepare("sign-message",{message:r,from:o.address})).uuid),!await this.confirmation.requestConfirmation({type:"sign-message",chainId:e,from:o.address,message:r,dappName:t==null?void 0:t.dappName,accountName:t==null?void 0:t.accountName}))throw new m(p.USER_REJECTED,"User rejected message signing");try{const c=await this.walletProvider.signMessage(this.userId,e,r,t==null?void 0:t.index,i,o.address);return this.verifySignatureSigner(r,c.signature,o.address),{chainId:e,signature:c.signature,message:r,address:o.address}}catch(c){throw c instanceof m?c:new m(p.SIGNATURE_FAILED,`Message signing failed (${e})`,c)}}async signTypedData(e,r,t){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");if(!this.walletProvider.signTypedData)throw new m(p.NOT_IMPLEMENTED,"signTypedData is not implemented");const n=await this.walletProvider.getAddress(this.userId,(t==null?void 0:t.index)??0);let o;if(this.walletProvider.prepare&&(o=(await this.walletProvider.prepare("sign-typed-data",{typedData:r,from:n.address})).uuid),!await this.confirmation.requestConfirmation({type:"sign-typed-data",chainId:e,from:n.address,typedData:r,dappName:t==null?void 0:t.dappName,accountName:t==null?void 0:t.accountName}))throw new m(p.USER_REJECTED,"User rejected typed data signing");try{const a=await this.walletProvider.signTypedData(this.userId,e,r,t==null?void 0:t.index,o,n.address);return se.validateSignatureFormat(a.signature),{chainId:e,signature:a.signature,address:n.address}}catch(a){throw a instanceof m?a:new m(p.SIGNATURE_FAILED,`Typed data signing failed (${e})`,a)}}async signTransaction(e,r,t){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");let n;this.walletProvider.prepare&&(n=(await this.walletProvider.prepare("sign",{tx:r})).uuid);const o=this.getNativeCurrency(e);if(!await this.confirmation.requestConfirmation({type:"sign",chainId:e,from:r.from,to:r.to,value:r.value,data:r.data,gasLimit:r.gasLimit,gasPrice:r.gasPrice,maxFeePerGas:r.maxFeePerGas,maxPriorityFeePerGas:r.maxPriorityFeePerGas,nativeSymbol:o.symbol,nativeDecimals:o.decimals,dappName:t==null?void 0:t.dappName,accountName:t==null?void 0:t.accountName}))throw new m(p.USER_REJECTED,"User rejected transaction signing");try{const a=await this.walletProvider.signTransaction(this.userId,e,r,t==null?void 0:t.index,n);return se.validateSignedTxFormat(a.signature),{chainId:e,signedTx:a.signature,txHash:a.txHash??""}}catch(a){if(a instanceof m)throw a;const c=a instanceof Error?a.message:String(a);throw new m(p.SIGNATURE_FAILED,`Transaction signing failed (${e}): ${c}`,a)}}async sendTransaction(e,r,t){if(this.ensureAuthenticated(),!this.userId)throw new m(p.AUTH_NOT_AUTHENTICATED,"User ID not found");let n;this.walletProvider.prepare&&(n=(await this.walletProvider.prepare("send",{tx:r})).uuid);const o=this.getNativeCurrency(e);if(!await this.confirmation.requestConfirmation({type:"send",chainId:e,from:r.from,to:r.to,value:r.value,data:r.data,gasLimit:r.gasLimit,gasPrice:r.gasPrice,maxFeePerGas:r.maxFeePerGas,maxPriorityFeePerGas:r.maxPriorityFeePerGas,nativeSymbol:o.symbol,nativeDecimals:o.decimals,dappName:t==null?void 0:t.dappName,accountName:t==null?void 0:t.accountName}))throw new m(p.USER_REJECTED,"User rejected transaction");try{let a;if(this.walletProvider.sendTransaction)a=(await this.walletProvider.sendTransaction(this.userId,e,r,n)).txHash;else{const l=await this.walletProvider.signTransaction(this.userId,e,r,t==null?void 0:t.index,n);a=l.txHash??l.signature}const c=se.formatTxAmount(r.value,o.symbol,o.decimals);return this.confirmation.showTransactionComplete({chainId:e,txHash:a,to:r.to,amount:c,nativeSymbol:o.symbol}).catch(()=>{}),{chainId:e,txHash:a,status:"pending"}}catch(a){const c=a instanceof Error?a.message:String(a);throw new m(p.TRANSACTION_FAILED,`Transaction failed (${e}): ${c}`,a)}}async getTransactionReceipt(e,r){if(!this.walletProvider.getTransactionReceipt)return null;try{return await this.walletProvider.getTransactionReceipt(e,r)}catch{return null}}async waitForTxAndGetReceipt(e,r,t={}){const n=t.intervalMs??1e3,o=1e4,i=t.timeoutMs??6e4,a=Date.now()+i;let c=n;for(;Date.now()<a;){const l=await this.getTransactionReceipt(e,r);if(l)return l;await new Promise(d=>setTimeout(d,c)),c=Math.min(c*2,o)}throw new m(p.UNKNOWN_ERROR,`Transaction receipt timeout (${e})`)}async sendTransactionWithWaitForReceipt(e,r,t={}){var c,l;const{txHash:n}=await this.sendTransaction(e,r),o=t.intervalMs??((c=this._config.receiptPolling)==null?void 0:c.intervalMs)??2e3,i=t.timeoutMs??((l=this._config.receiptPolling)==null?void 0:l.timeoutMs)??6e4,a=await this.waitForTxAndGetReceipt(n,e,{intervalMs:o,timeoutMs:i});return{chainId:e,txHash:n,receipt:a}}async getNonce(e){this.ensureAuthenticated();const r=this.address;if(!r)return 0;if(!this.walletProvider.getTransactionCount)throw new m(p.NOT_IMPLEMENTED,"getTransactionCount is not implemented");try{return await this.walletProvider.getTransactionCount(r,e)}catch(t){const n=t instanceof Error?t.message:String(t);throw new m(p.UNKNOWN_ERROR,`Failed to get nonce: ${n}`,t)}}async getBalance(e){this.ensureAuthenticated();const r=this.address;if(!r)return{wei:"0x0",formatted:"0",chainId:e};if(!this.walletProvider.getBalance)throw new m(p.NOT_IMPLEMENTED,"getBalance is not implemented");try{const t=await this.walletProvider.getBalance(r,e);return{wei:t,formatted:se.formatWei(t),chainId:e}}catch(t){const n=t instanceof Error?t.message:String(t);throw new m(p.UNKNOWN_ERROR,`Failed to get balance (${e}): ${n}`,t)}}static formatWei(e){if(!e||e==="0x0"||e==="0x")return"0";try{const r=BigInt(e);if(r===0n)return"0";const t=BigInt("1000000000000000000"),n=r/t,i=(r%t).toString().padStart(18,"0").replace(/0+$/,"").slice(0,6);return i?`${n}.${i}`:`${n}`}catch{return"?"}}getProvider(e){return this.ensureAuthenticated(),new Pt(this,e)}async walletRpc(e,r,t){if(this.ensureAuthenticated(),!this.walletProvider.rpcRequest)throw new m(p.NOT_IMPLEMENTED,"rpcRequest is not implemented");try{return await this.walletProvider.rpcRequest(e,r,t)}catch(n){const o=n instanceof Error?n.message:String(n);throw new m(p.UNKNOWN_ERROR,`rpcRequest failed [${e}] (${t}): ${o}`,n)}}static formatTxAmount(e,r,t){if(!(!e||e==="0x"||e==="0x0"))try{const n=BigInt(e);if(n===0n)return;const o=10n**BigInt(t),i=n/o,c=(n%o).toString().padStart(t,"0").slice(0,6).replace(/0+$/,"");return`${c?`${i}.${c}`:`${i}`} ${r}`}catch{return}}getNativeCurrency(e){const r=parseInt(e.split(":")[1]??"0",10);return se.CHAIN_NATIVE_CURRENCY[r]??{symbol:"ETH",decimals:18}}async handleMigrationFlow(e){g.log('[CROSSx][Migration Phase 3] "Wallet Found" 팝업 표시');const r=await this.confirmation.showMigrationFoundPrompt();if(g.log("[CROSSx][Migration Phase 3] 사용자 선택:",r),r==="skip")return g.log("[CROSSx][Migration Phase 3] 사용자가 마이그레이션을 건너뜀 → 종료"),null;let t,n=0;for(;;){n++,g.log(`[CROSSx][Migration Phase 4] PIN 입력 팝업 표시 (시도 #${n})`,t?`— 이전 에러: ${t}`:"");const o=await this.confirmation.showPinInputPrompt(t);if(o===null)return g.log("[CROSSx][Migration Phase 4] 사용자가 PIN 입력을 취소함 → 종료"),null;g.log(`[CROSSx][Migration Phase 4] PIN 입력 완료 (${o.length}자리), Gateway 마이그레이션 API 호출`);try{const i=await this.migrateWalletUseCase.execute(o,e);return g.log("[CROSSx][Migration Phase 5] 마이그레이션 성공 — address:",i.address),i}catch(i){if(i instanceof m&&i.code===p.MIGRATION_FAILED){g.warn(`[CROSSx][Migration Phase 4] PIN 불일치 (시도 #${n}) — 재시도 요청`),t="Incorrect PIN. Please try again.";continue}throw g.error("[CROSSx][Migration Phase 4] 마이그레이션 실패 (복구 불가):",i),i}}}static validateSignatureFormat(e){const r=e.startsWith("0x")?e.slice(2):e;if(!/^[0-9a-fA-F]+$/.test(r))throw new m(p.SIGNATURE_FAILED,"Invalid signature: not a valid hex string");if(r.length!==130)throw new m(p.SIGNATURE_FAILED,`Invalid signature length: expected 130 hex chars (65 bytes), got ${r.length}`)}static validateSignedTxFormat(e){const r=e.startsWith("0x")?e.slice(2):e;if(!/^[0-9a-fA-F]+$/.test(r))throw new m(p.SIGNATURE_FAILED,"Invalid signedTx: not a valid hex string");if(r.length<2)throw new m(p.SIGNATURE_FAILED,"Invalid signedTx: too short")}verifySignatureSigner(e,r,t){if(this.crypto.recoverPersonalSignSigner)try{const n=this.crypto.recoverPersonalSignSigner(e,r);if(n.toLowerCase()!==t.toLowerCase())throw g.error("[CROSSx] 서명 검증 실패: 서명자 주소 불일치",{expected:t,recovered:n}),new m(p.SIGNATURE_SIGNER_MISMATCH,`Signature signer mismatch: expected ${t}, recovered ${n}`);g.log("[CROSSx] 서명 ecrecover 검증 성공")}catch(n){if(n instanceof m)throw n;g.warn("[CROSSx] ecrecover 검증 중 예외 (무시):",n)}}applyAuthResult(e){var r,t,n,o;this.authenticated=e.success,this.userId=((r=e.user)==null?void 0:r.id)??null,this.address=e.address??null,this.userEmail=((t=e.user)==null?void 0:t.email)??null,this.providerSub=((n=e.user)==null?void 0:n.providerSub)??null,this.loginType=se.normalizeLoginType((o=e.user)==null?void 0:o.signInProvider),this.tokenSignatureVerified=e.tokenSignatureVerified??!1}clearAuthState(){this.authenticated=!1,this.userId=null,this.address=null,this.userEmail=null,this.providerSub=null,this.loginType=null,this.tokenSignatureVerified=!1}static normalizeLoginType(e){return e?e.includes("google")?"google":e.includes("apple")?"apple":e:null}ensureInitialized(){if(!this.initialized)throw new m(p.AUTH_NOT_INITIALIZED,"SDK is not initialized. Call initialize() first.")}ensureAuthenticated(){if(this.ensureInitialized(),!this.authenticated)throw new m(p.AUTH_NOT_AUTHENTICATED,"Not authenticated. Call signIn() first.")}dispose(){this.clearAuthState(),this.initialized=!1,xt(null)}};se.CHAIN_NATIVE_CURRENCY={1:{symbol:"ETH",decimals:18},5:{symbol:"ETH",decimals:18},11155111:{symbol:"ETH",decimals:18},17e3:{symbol:"ETH",decimals:18},10:{symbol:"ETH",decimals:18},420:{symbol:"ETH",decimals:18},42161:{symbol:"ETH",decimals:18},421614:{symbol:"ETH",decimals:18},8453:{symbol:"ETH",decimals:18},84532:{symbol:"ETH",decimals:18},137:{symbol:"POL",decimals:18},80002:{symbol:"POL",decimals:18},56:{symbol:"BNB",decimals:18},97:{symbol:"BNB",decimals:18},43114:{symbol:"AVAX",decimals:18},43113:{symbol:"AVAX",decimals:18},250:{symbol:"FTM",decimals:18},612044:{symbol:"tCROSS",decimals:18},612055:{symbol:"CROSS",decimals:18}};let $e=se;class zr{constructor(){this.prefix="crossx_"}async set(e,r){try{const t=JSON.stringify(r);localStorage.setItem(this.prefix+e,t)}catch(t){throw g.error("Storage set error:",t),t}}async get(e){try{const r=localStorage.getItem(this.prefix+e);return r?JSON.parse(r):null}catch(r){return g.error("Storage get error:",r),null}}async remove(e){try{localStorage.removeItem(this.prefix+e)}catch(r){throw g.error("Storage remove error:",r),r}}async clear(){try{Object.keys(localStorage).forEach(r=>{r.startsWith(this.prefix)&&localStorage.removeItem(r)})}catch(e){throw g.error("Storage clear error:",e),e}}}/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */function tt(s){return s instanceof Uint8Array||ArrayBuffer.isView(s)&&s.constructor.name==="Uint8Array"}function ie(s,e=""){if(!Number.isSafeInteger(s)||s<0){const r=e&&`"${e}" `;throw new Error(`${r}expected integer >= 0, got ${s}`)}}function M(s,e,r=""){const t=tt(s),n=s==null?void 0:s.length,o=e!==void 0;if(!t||o&&n!==e){const i=r&&`"${r}" `,a=o?` of length ${e}`:"",c=t?`length=${n}`:`type=${typeof s}`;throw new Error(i+"expected Uint8Array"+a+", got "+c)}return s}function Bt(s){if(typeof s!="function"||typeof s.create!="function")throw new Error("Hash must wrapped by utils.createHasher");ie(s.outputLen),ie(s.blockLen)}function be(s,e=!0){if(s.destroyed)throw new Error("Hash instance has been destroyed");if(e&&s.finished)throw new Error("Hash#digest() has already been called")}function $t(s,e){M(s,void 0,"digestInto() output");const r=e.outputLen;if(s.length<r)throw new Error('"digestInto() output" expected to be of length >='+r)}function jr(s){return new Uint32Array(s.buffer,s.byteOffset,Math.floor(s.byteLength/4))}function ve(...s){for(let e=0;e<s.length;e++)s[e].fill(0)}function Ve(s){return new DataView(s.buffer,s.byteOffset,s.byteLength)}function ee(s,e){return s<<32-e|s>>>e}const Yr=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;function Zr(s){return s<<24&4278190080|s<<8&16711680|s>>>8&65280|s>>>24&255}function Xr(s){for(let e=0;e<s.length;e++)s[e]=Zr(s[e]);return s}const _t=Yr?s=>s:Xr,Mt=typeof Uint8Array.from([]).toHex=="function"&&typeof Uint8Array.fromHex=="function",Jr=Array.from({length:256},(s,e)=>e.toString(16).padStart(2,"0"));function Ae(s){if(M(s),Mt)return s.toHex();let e="";for(let r=0;r<s.length;r++)e+=Jr[s[r]];return e}const re={_0:48,_9:57,A:65,F:70,a:97,f:102};function mt(s){if(s>=re._0&&s<=re._9)return s-re._0;if(s>=re.A&&s<=re.F)return s-(re.A-10);if(s>=re.a&&s<=re.f)return s-(re.a-10)}function Me(s){if(typeof s!="string")throw new Error("hex string expected, got "+typeof s);if(Mt)return Uint8Array.fromHex(s);const e=s.length,r=e/2;if(e%2)throw new Error("hex string expected, got unpadded hex of length "+e);const t=new Uint8Array(r);for(let n=0,o=0;n<r;n++,o+=2){const i=mt(s.charCodeAt(o)),a=mt(s.charCodeAt(o+1));if(i===void 0||a===void 0){const c=s[o]+s[o+1];throw new Error('hex string expected, got non-hex character "'+c+'" at index '+o)}t[n]=i*16+a}return t}function ue(...s){let e=0;for(let t=0;t<s.length;t++){const n=s[t];M(n),e+=n.length}const r=new Uint8Array(e);for(let t=0,n=0;t<s.length;t++){const o=s[t];r.set(o,n),n+=o.length}return r}function Dt(s,e={}){const r=(n,o)=>s(o).update(n).digest(),t=s(void 0);return r.outputLen=t.outputLen,r.blockLen=t.blockLen,r.create=n=>s(n),Object.assign(r,e),Object.freeze(r)}function Ut(s=32){const e=typeof globalThis=="object"?globalThis.crypto:null;if(typeof(e==null?void 0:e.getRandomValues)!="function")throw new Error("crypto.getRandomValues must be defined");return e.getRandomValues(new Uint8Array(s))}const Qr=s=>({oid:Uint8Array.from([6,9,96,134,72,1,101,3,4,2,s])});function es(s,e,r){return s&e^~s&r}function ts(s,e,r){return s&e^s&r^e&r}class rs{constructor(e,r,t,n){w(this,"blockLen");w(this,"outputLen");w(this,"padOffset");w(this,"isLE");w(this,"buffer");w(this,"view");w(this,"finished",!1);w(this,"length",0);w(this,"pos",0);w(this,"destroyed",!1);this.blockLen=e,this.outputLen=r,this.padOffset=t,this.isLE=n,this.buffer=new Uint8Array(e),this.view=Ve(this.buffer)}update(e){be(this),M(e);const{view:r,buffer:t,blockLen:n}=this,o=e.length;for(let i=0;i<o;){const a=Math.min(n-this.pos,o-i);if(a===n){const c=Ve(e);for(;n<=o-i;i+=n)this.process(c,i);continue}t.set(e.subarray(i,i+a),this.pos),this.pos+=a,i+=a,this.pos===n&&(this.process(r,0),this.pos=0)}return this.length+=e.length,this.roundClean(),this}digestInto(e){be(this),$t(e,this),this.finished=!0;const{buffer:r,view:t,blockLen:n,isLE:o}=this;let{pos:i}=this;r[i++]=128,ve(this.buffer.subarray(i)),this.padOffset>n-i&&(this.process(t,0),i=0);for(let f=i;f<n;f++)r[f]=0;t.setBigUint64(n-8,BigInt(this.length*8),o),this.process(t,0);const a=Ve(e),c=this.outputLen;if(c%4)throw new Error("_sha2: outputLen must be aligned to 32bit");const l=c/4,d=this.get();if(l>d.length)throw new Error("_sha2: outputLen bigger than state");for(let f=0;f<l;f++)a.setUint32(4*f,d[f],o)}digest(){const{buffer:e,outputLen:r}=this;this.digestInto(e);const t=e.slice(0,r);return this.destroy(),t}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:r,buffer:t,length:n,finished:o,destroyed:i,pos:a}=this;return e.destroyed=i,e.finished=o,e.length=n,e.pos=a,n%r&&e.buffer.set(t),e}clone(){return this._cloneInto()}}const ce=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),ke=BigInt(2**32-1),wt=BigInt(32);function ss(s,e=!1){return e?{h:Number(s&ke),l:Number(s>>wt&ke)}:{h:Number(s>>wt&ke)|0,l:Number(s&ke)|0}}function ns(s,e=!1){const r=s.length;let t=new Uint32Array(r),n=new Uint32Array(r);for(let o=0;o<r;o++){const{h:i,l:a}=ss(s[o],e);[t[o],n[o]]=[i,a]}return[t,n]}const os=(s,e,r)=>s<<r|e>>>32-r,is=(s,e,r)=>e<<r|s>>>32-r,as=(s,e,r)=>e<<r-32|s>>>64-r,cs=(s,e,r)=>s<<r-32|e>>>64-r,ls=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),le=new Uint32Array(64);class ds extends rs{constructor(e){super(64,e,8,!1)}get(){const{A:e,B:r,C:t,D:n,E:o,F:i,G:a,H:c}=this;return[e,r,t,n,o,i,a,c]}set(e,r,t,n,o,i,a,c){this.A=e|0,this.B=r|0,this.C=t|0,this.D=n|0,this.E=o|0,this.F=i|0,this.G=a|0,this.H=c|0}process(e,r){for(let f=0;f<16;f++,r+=4)le[f]=e.getUint32(r,!1);for(let f=16;f<64;f++){const y=le[f-15],_=le[f-2],E=ee(y,7)^ee(y,18)^y>>>3,O=ee(_,17)^ee(_,19)^_>>>10;le[f]=O+le[f-7]+E+le[f-16]|0}let{A:t,B:n,C:o,D:i,E:a,F:c,G:l,H:d}=this;for(let f=0;f<64;f++){const y=ee(a,6)^ee(a,11)^ee(a,25),_=d+y+es(a,c,l)+ls[f]+le[f]|0,O=(ee(t,2)^ee(t,13)^ee(t,22))+ts(t,n,o)|0;d=l,l=c,c=a,a=i+_|0,i=o,o=n,n=t,t=_+O|0}t=t+this.A|0,n=n+this.B|0,o=o+this.C|0,i=i+this.D|0,a=a+this.E|0,c=c+this.F|0,l=l+this.G|0,d=d+this.H|0,this.set(t,n,o,i,a,c,l,d)}roundClean(){ve(le)}destroy(){this.set(0,0,0,0,0,0,0,0),ve(this.buffer)}}class us extends ds{constructor(){super(32);w(this,"A",ce[0]|0);w(this,"B",ce[1]|0);w(this,"C",ce[2]|0);w(this,"D",ce[3]|0);w(this,"E",ce[4]|0);w(this,"F",ce[5]|0);w(this,"G",ce[6]|0);w(this,"H",ce[7]|0)}}const hs=Dt(()=>new us,Qr(1));/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const rt=BigInt(0),Ze=BigInt(1);function De(s,e=""){if(typeof s!="boolean"){const r=e&&`"${e}" `;throw new Error(r+"expected boolean, got type="+typeof s)}return s}function Ht(s){if(typeof s=="bigint"){if(!Be(s))throw new Error("positive bigint expected, got "+s)}else ie(s);return s}function Ce(s){const e=Ht(s).toString(16);return e.length&1?"0"+e:e}function Ft(s){if(typeof s!="string")throw new Error("hex string expected, got "+typeof s);return s===""?rt:BigInt("0x"+s)}function qe(s){return Ft(Ae(s))}function qt(s){return Ft(Ae(fs(M(s)).reverse()))}function st(s,e){ie(e),s=Ht(s);const r=Me(s.toString(16).padStart(e*2,"0"));if(r.length!==e)throw new Error("number too large");return r}function Gt(s,e){return st(s,e).reverse()}function fs(s){return Uint8Array.from(s)}const Be=s=>typeof s=="bigint"&&rt<=s;function gs(s,e,r){return Be(s)&&Be(e)&&Be(r)&&e<=s&&s<r}function ps(s,e,r,t){if(!gs(e,r,t))throw new Error("expected valid "+s+": "+r+" <= n < "+t+", got "+e)}function xs(s){let e;for(e=0;s>rt;s>>=Ze,e+=1);return e}const nt=s=>(Ze<<BigInt(s))-Ze;function _s(s,e,r){if(ie(s,"hashLen"),ie(e,"qByteLen"),typeof r!="function")throw new Error("hmacFn must be a function");const t=S=>new Uint8Array(S),n=Uint8Array.of(),o=Uint8Array.of(0),i=Uint8Array.of(1),a=1e3;let c=t(s),l=t(s),d=0;const f=()=>{c.fill(1),l.fill(0),d=0},y=(...S)=>r(l,ue(c,...S)),_=(S=n)=>{l=y(o,S),c=y(),S.length!==0&&(l=y(i,S),c=y())},E=()=>{if(d++>=a)throw new Error("drbg: tried max amount of iterations");let S=0;const C=[];for(;S<e;){c=y();const U=c.slice();C.push(U),S+=c.length}return ue(...C)};return(S,C)=>{f(),_(S);let U;for(;!(U=C(E()));)_();return f(),U}}function ot(s,e={},r={}){if(!s||typeof s!="object")throw new Error("expected valid options object");function t(o,i,a){const c=s[o];if(a&&c===void 0)return;const l=typeof c;if(l!==i||c===null)throw new Error(`param "${o}" is invalid: expected ${i}, got ${l}`)}const n=(o,i)=>Object.entries(o).forEach(([a,c])=>t(a,c,i));n(e,!1),n(r,!0)}function yt(s){const e=new WeakMap;return(r,...t)=>{const n=e.get(r);if(n!==void 0)return n;const o=s(r,...t);return e.set(r,o),o}}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Y=BigInt(0),K=BigInt(1),_e=BigInt(2),Wt=BigInt(3),Vt=BigInt(4),Kt=BigInt(5),ms=BigInt(7),zt=BigInt(8),ws=BigInt(9),jt=BigInt(16);function Q(s,e){const r=s%e;return r>=Y?r:e+r}function J(s,e,r){let t=s;for(;e-- >Y;)t*=t,t%=r;return t}function bt(s,e){if(s===Y)throw new Error("invert: expected non-zero number");if(e<=Y)throw new Error("invert: expected positive modulus, got "+e);let r=Q(s,e),t=e,n=Y,o=K;for(;r!==Y;){const a=t/r,c=t%r,l=n-o*a;t=r,r=c,n=o,o=l}if(t!==K)throw new Error("invert: does not exist");return Q(n,e)}function it(s,e,r){if(!s.eql(s.sqr(e),r))throw new Error("Cannot find square root")}function Yt(s,e){const r=(s.ORDER+K)/Vt,t=s.pow(e,r);return it(s,t,e),t}function ys(s,e){const r=(s.ORDER-Kt)/zt,t=s.mul(e,_e),n=s.pow(t,r),o=s.mul(e,n),i=s.mul(s.mul(o,_e),n),a=s.mul(o,s.sub(i,s.ONE));return it(s,a,e),a}function bs(s){const e=Ge(s),r=Zt(s),t=r(e,e.neg(e.ONE)),n=r(e,t),o=r(e,e.neg(t)),i=(s+ms)/jt;return(a,c)=>{let l=a.pow(c,i),d=a.mul(l,t);const f=a.mul(l,n),y=a.mul(l,o),_=a.eql(a.sqr(d),c),E=a.eql(a.sqr(f),c);l=a.cmov(l,d,_),d=a.cmov(y,f,E);const O=a.eql(a.sqr(d),c),S=a.cmov(l,d,O);return it(a,S,c),S}}function Zt(s){if(s<Wt)throw new Error("sqrt is not defined for small field");let e=s-K,r=0;for(;e%_e===Y;)e/=_e,r++;let t=_e;const n=Ge(s);for(;vt(n,t)===1;)if(t++>1e3)throw new Error("Cannot find square root: probably non-prime P");if(r===1)return Yt;let o=n.pow(t,e);const i=(e+K)/_e;return function(c,l){if(c.is0(l))return l;if(vt(c,l)!==1)throw new Error("Cannot find square root");let d=r,f=c.mul(c.ONE,o),y=c.pow(l,e),_=c.pow(l,i);for(;!c.eql(y,c.ONE);){if(c.is0(y))return c.ZERO;let E=1,O=c.sqr(y);for(;!c.eql(O,c.ONE);)if(E++,O=c.sqr(O),E===d)throw new Error("Cannot find square root");const S=K<<BigInt(d-E-1),C=c.pow(f,S);d=E,f=c.sqr(C),y=c.mul(y,f),_=c.mul(_,C)}return _}}function vs(s){return s%Vt===Wt?Yt:s%zt===Kt?ys:s%jt===ws?bs(s):Zt(s)}const Es=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Ss(s){const e={ORDER:"bigint",BYTES:"number",BITS:"number"},r=Es.reduce((t,n)=>(t[n]="function",t),e);return ot(s,r),s}function Ts(s,e,r){if(r<Y)throw new Error("invalid exponent, negatives unsupported");if(r===Y)return s.ONE;if(r===K)return e;let t=s.ONE,n=e;for(;r>Y;)r&K&&(t=s.mul(t,n)),n=s.sqr(n),r>>=K;return t}function Xt(s,e,r=!1){const t=new Array(e.length).fill(r?s.ZERO:void 0),n=e.reduce((i,a,c)=>s.is0(a)?i:(t[c]=i,s.mul(i,a)),s.ONE),o=s.inv(n);return e.reduceRight((i,a,c)=>s.is0(a)?i:(t[c]=s.mul(i,t[c]),s.mul(i,a)),o),t}function vt(s,e){const r=(s.ORDER-K)/_e,t=s.pow(e,r),n=s.eql(t,s.ONE),o=s.eql(t,s.ZERO),i=s.eql(t,s.neg(s.ONE));if(!n&&!o&&!i)throw new Error("invalid Legendre symbol result");return n?1:o?0:-1}function Is(s,e){e!==void 0&&ie(e);const r=e!==void 0?e:s.toString(2).length,t=Math.ceil(r/8);return{nBitLength:r,nByteLength:t}}class As{constructor(e,r={}){w(this,"ORDER");w(this,"BITS");w(this,"BYTES");w(this,"isLE");w(this,"ZERO",Y);w(this,"ONE",K);w(this,"_lengths");w(this,"_sqrt");w(this,"_mod");var i;if(e<=Y)throw new Error("invalid field: expected ORDER > 0, got "+e);let t;this.isLE=!1,r!=null&&typeof r=="object"&&(typeof r.BITS=="number"&&(t=r.BITS),typeof r.sqrt=="function"&&(this.sqrt=r.sqrt),typeof r.isLE=="boolean"&&(this.isLE=r.isLE),r.allowedLengths&&(this._lengths=(i=r.allowedLengths)==null?void 0:i.slice()),typeof r.modFromBytes=="boolean"&&(this._mod=r.modFromBytes));const{nBitLength:n,nByteLength:o}=Is(e,t);if(o>2048)throw new Error("invalid field: expected ORDER of <= 2048 bytes");this.ORDER=e,this.BITS=n,this.BYTES=o,this._sqrt=void 0,Object.preventExtensions(this)}create(e){return Q(e,this.ORDER)}isValid(e){if(typeof e!="bigint")throw new Error("invalid field element: expected bigint, got "+typeof e);return Y<=e&&e<this.ORDER}is0(e){return e===Y}isValidNot0(e){return!this.is0(e)&&this.isValid(e)}isOdd(e){return(e&K)===K}neg(e){return Q(-e,this.ORDER)}eql(e,r){return e===r}sqr(e){return Q(e*e,this.ORDER)}add(e,r){return Q(e+r,this.ORDER)}sub(e,r){return Q(e-r,this.ORDER)}mul(e,r){return Q(e*r,this.ORDER)}pow(e,r){return Ts(this,e,r)}div(e,r){return Q(e*bt(r,this.ORDER),this.ORDER)}sqrN(e){return e*e}addN(e,r){return e+r}subN(e,r){return e-r}mulN(e,r){return e*r}inv(e){return bt(e,this.ORDER)}sqrt(e){return this._sqrt||(this._sqrt=vs(this.ORDER)),this._sqrt(this,e)}toBytes(e){return this.isLE?Gt(e,this.BYTES):st(e,this.BYTES)}fromBytes(e,r=!1){M(e);const{_lengths:t,BYTES:n,isLE:o,ORDER:i,_mod:a}=this;if(t){if(!t.includes(e.length)||e.length>n)throw new Error("Field.fromBytes: expected "+t+" bytes, got "+e.length);const l=new Uint8Array(n);l.set(e,o?0:l.length-e.length),e=l}if(e.length!==n)throw new Error("Field.fromBytes: expected "+n+" bytes, got "+e.length);let c=o?qt(e):qe(e);if(a&&(c=Q(c,i)),!r&&!this.isValid(c))throw new Error("invalid field element: outside of range 0..ORDER");return c}invertBatch(e){return Xt(this,e)}cmov(e,r,t){return t?r:e}}function Ge(s,e={}){return new As(s,e)}function Jt(s){if(typeof s!="bigint")throw new Error("field order must be bigint");const e=s.toString(2).length;return Math.ceil(e/8)}function Qt(s){const e=Jt(s);return e+Math.ceil(e/2)}function Rs(s,e,r=!1){M(s);const t=s.length,n=Jt(e),o=Qt(e);if(t<16||t<o||t>1024)throw new Error("expected "+o+"-1024 bytes of input, got "+t);const i=r?qt(s):qe(s),a=Q(i,e-K)+K;return r?Gt(a,n):st(a,n)}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Ee=BigInt(0),me=BigInt(1);function Ue(s,e){const r=e.negate();return s?r:e}function Et(s,e){const r=Xt(s.Fp,e.map(t=>t.Z));return e.map((t,n)=>s.fromAffine(t.toAffine(r[n])))}function er(s,e){if(!Number.isSafeInteger(s)||s<=0||s>e)throw new Error("invalid window size, expected [1.."+e+"], got W="+s)}function Ke(s,e){er(s,e);const r=Math.ceil(e/s)+1,t=2**(s-1),n=2**s,o=nt(s),i=BigInt(s);return{windows:r,windowSize:t,mask:o,maxNumber:n,shiftBy:i}}function St(s,e,r){const{windowSize:t,mask:n,maxNumber:o,shiftBy:i}=r;let a=Number(s&n),c=s>>i;a>t&&(a-=o,c+=me);const l=e*t,d=l+Math.abs(a)-1,f=a===0,y=a<0,_=e%2!==0;return{nextN:c,offset:d,isZero:f,isNeg:y,isNegF:_,offsetF:l}}const ze=new WeakMap,tr=new WeakMap;function je(s){return tr.get(s)||1}function Tt(s){if(s!==Ee)throw new Error("invalid wNAF")}class Os{constructor(e,r){w(this,"BASE");w(this,"ZERO");w(this,"Fn");w(this,"bits");this.BASE=e.BASE,this.ZERO=e.ZERO,this.Fn=e.Fn,this.bits=r}_unsafeLadder(e,r,t=this.ZERO){let n=e;for(;r>Ee;)r&me&&(t=t.add(n)),n=n.double(),r>>=me;return t}precomputeWindow(e,r){const{windows:t,windowSize:n}=Ke(r,this.bits),o=[];let i=e,a=i;for(let c=0;c<t;c++){a=i,o.push(a);for(let l=1;l<n;l++)a=a.add(i),o.push(a);i=a.double()}return o}wNAF(e,r,t){if(!this.Fn.isValid(t))throw new Error("invalid scalar");let n=this.ZERO,o=this.BASE;const i=Ke(e,this.bits);for(let a=0;a<i.windows;a++){const{nextN:c,offset:l,isZero:d,isNeg:f,isNegF:y,offsetF:_}=St(t,a,i);t=c,d?o=o.add(Ue(y,r[_])):n=n.add(Ue(f,r[l]))}return Tt(t),{p:n,f:o}}wNAFUnsafe(e,r,t,n=this.ZERO){const o=Ke(e,this.bits);for(let i=0;i<o.windows&&t!==Ee;i++){const{nextN:a,offset:c,isZero:l,isNeg:d}=St(t,i,o);if(t=a,!l){const f=r[c];n=n.add(d?f.negate():f)}}return Tt(t),n}getPrecomputes(e,r,t){let n=ze.get(r);return n||(n=this.precomputeWindow(r,e),e!==1&&(typeof t=="function"&&(n=t(n)),ze.set(r,n))),n}cached(e,r,t){const n=je(e);return this.wNAF(n,this.getPrecomputes(n,e,t),r)}unsafe(e,r,t,n){const o=je(e);return o===1?this._unsafeLadder(e,r,n):this.wNAFUnsafe(o,this.getPrecomputes(o,e,t),r,n)}createCache(e,r){er(r,this.bits),tr.set(e,r),ze.delete(e)}hasCache(e){return je(e)!==1}}function Ns(s,e,r,t){let n=e,o=s.ZERO,i=s.ZERO;for(;r>Ee||t>Ee;)r&me&&(o=o.add(n)),t&me&&(i=i.add(n)),n=n.double(),r>>=me,t>>=me;return{p1:o,p2:i}}function It(s,e,r){if(e){if(e.ORDER!==s)throw new Error("Field.ORDER must match order: Fp == p, Fn == n");return Ss(e),e}else return Ge(s,{isLE:r})}function ks(s,e,r={},t){if(t===void 0&&(t=s==="edwards"),!e||typeof e!="object")throw new Error(`expected valid ${s} CURVE object`);for(const c of["p","n","h"]){const l=e[c];if(!(typeof l=="bigint"&&l>Ee))throw new Error(`CURVE.${c} must be positive bigint`)}const n=It(e.p,r.Fp,t),o=It(e.n,r.Fn,t),a=["Gx","Gy","a","b"];for(const c of a)if(!n.isValid(e[c]))throw new Error(`CURVE.${c} must be valid field element of CURVE.Fp`);return e=Object.freeze(Object.assign({},e)),{CURVE:e,Fp:n,Fn:o}}function Cs(s,e){return function(t){const n=s(t);return{secretKey:n,publicKey:e(n)}}}class rr{constructor(e,r){w(this,"oHash");w(this,"iHash");w(this,"blockLen");w(this,"outputLen");w(this,"finished",!1);w(this,"destroyed",!1);if(Bt(e),M(r,void 0,"key"),this.iHash=e.create(),typeof this.iHash.update!="function")throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const t=this.blockLen,n=new Uint8Array(t);n.set(r.length>t?e.create().update(r).digest():r);for(let o=0;o<n.length;o++)n[o]^=54;this.iHash.update(n),this.oHash=e.create();for(let o=0;o<n.length;o++)n[o]^=106;this.oHash.update(n),ve(n)}update(e){return be(this),this.iHash.update(e),this}digestInto(e){be(this),M(e,this.outputLen,"output"),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:r,iHash:t,finished:n,destroyed:o,blockLen:i,outputLen:a}=this;return e=e,e.finished=n,e.destroyed=o,e.blockLen=i,e.outputLen=a,e.oHash=r._cloneInto(e.oHash),e.iHash=t._cloneInto(e.iHash),e}clone(){return this._cloneInto()}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const sr=(s,e,r)=>new rr(s,e).update(r).digest();sr.create=(s,e)=>new rr(s,e);/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const At=(s,e)=>(s+(s>=0?e:-e)/nr)/e;function Ps(s,e,r){const[[t,n],[o,i]]=e,a=At(i*s,r),c=At(-n*s,r);let l=s-a*t-c*o,d=-a*n-c*i;const f=l<ne,y=d<ne;f&&(l=-l),y&&(d=-d);const _=nt(Math.ceil(xs(r)/2))+ye;if(l<ne||l>=_||d<ne||d>=_)throw new Error("splitScalar (endomorphism): failed, k="+s);return{k1neg:f,k1:l,k2neg:y,k2:d}}function Xe(s){if(!["compact","recovered","der"].includes(s))throw new Error('Signature format must be "compact", "recovered", or "der"');return s}function Ye(s,e){const r={};for(let t of Object.keys(e))r[t]=s[t]===void 0?e[t]:s[t];return De(r.lowS,"lowS"),De(r.prehash,"prehash"),r.format!==void 0&&Xe(r.format),r}class Ls extends Error{constructor(e=""){super(e)}}const de={Err:Ls,_tlv:{encode:(s,e)=>{const{Err:r}=de;if(s<0||s>256)throw new r("tlv.encode: wrong tag");if(e.length&1)throw new r("tlv.encode: unpadded data");const t=e.length/2,n=Ce(t);if(n.length/2&128)throw new r("tlv.encode: long form length too big");const o=t>127?Ce(n.length/2|128):"";return Ce(s)+o+n+e},decode(s,e){const{Err:r}=de;let t=0;if(s<0||s>256)throw new r("tlv.encode: wrong tag");if(e.length<2||e[t++]!==s)throw new r("tlv.decode: wrong tlv");const n=e[t++],o=!!(n&128);let i=0;if(!o)i=n;else{const c=n&127;if(!c)throw new r("tlv.decode(long): indefinite length not supported");if(c>4)throw new r("tlv.decode(long): byte length is too big");const l=e.subarray(t,t+c);if(l.length!==c)throw new r("tlv.decode: length bytes not complete");if(l[0]===0)throw new r("tlv.decode(long): zero leftmost byte");for(const d of l)i=i<<8|d;if(t+=c,i<128)throw new r("tlv.decode(long): not minimal encoding")}const a=e.subarray(t,t+i);if(a.length!==i)throw new r("tlv.decode: wrong value length");return{v:a,l:e.subarray(t+i)}}},_int:{encode(s){const{Err:e}=de;if(s<ne)throw new e("integer: negative integers are not allowed");let r=Ce(s);if(Number.parseInt(r[0],16)&8&&(r="00"+r),r.length&1)throw new e("unexpected DER parsing assertion: unpadded hex");return r},decode(s){const{Err:e}=de;if(s[0]&128)throw new e("invalid signature integer: negative");if(s[0]===0&&!(s[1]&128))throw new e("invalid signature integer: unnecessary leading zero");return qe(s)}},toSig(s){const{Err:e,_int:r,_tlv:t}=de,n=M(s,void 0,"signature"),{v:o,l:i}=t.decode(48,n);if(i.length)throw new e("invalid signature: left bytes after parsing");const{v:a,l:c}=t.decode(2,o),{v:l,l:d}=t.decode(2,c);if(d.length)throw new e("invalid signature: left bytes after parsing");return{r:r.decode(a),s:r.decode(l)}},hexFromSig(s){const{_tlv:e,_int:r}=de,t=e.encode(2,r.encode(s.r)),n=e.encode(2,r.encode(s.s)),o=t+n;return e.encode(48,o)}},ne=BigInt(0),ye=BigInt(1),nr=BigInt(2),Pe=BigInt(3),Bs=BigInt(4);function $s(s,e={}){const r=ks("weierstrass",s,e),{Fp:t,Fn:n}=r;let o=r.CURVE;const{h:i,n:a}=o;ot(e,{},{allowInfinityPoint:"boolean",clearCofactor:"function",isTorsionFree:"function",fromBytes:"function",toBytes:"function",endo:"object"});const{endo:c}=e;if(c&&(!t.is0(o.a)||typeof c.beta!="bigint"||!Array.isArray(c.basises)))throw new Error('invalid endo: expected "beta": bigint and "basises": array');const l=ir(t,n);function d(){if(!t.isOdd)throw new Error("compression is not supported: Field does not have .isOdd()")}function f(P,h,u){const{x,y:v}=h.toAffine(),I=t.toBytes(x);if(De(u,"isCompressed"),u){d();const T=!t.isOdd(v);return ue(or(T),I)}else return ue(Uint8Array.of(4),I,t.toBytes(v))}function y(P){M(P,void 0,"Point");const{publicKey:h,publicKeyUncompressed:u}=l,x=P.length,v=P[0],I=P.subarray(1);if(x===h&&(v===2||v===3)){const T=t.fromBytes(I);if(!t.isValid(T))throw new Error("bad point: is not on curve, wrong x");const A=O(T);let b;try{b=t.sqrt(A)}catch(H){const $=H instanceof Error?": "+H.message:"";throw new Error("bad point: is not on curve, sqrt error"+$)}d();const R=t.isOdd(b);return(v&1)===1!==R&&(b=t.neg(b)),{x:T,y:b}}else if(x===u&&v===4){const T=t.BYTES,A=t.fromBytes(I.subarray(0,T)),b=t.fromBytes(I.subarray(T,T*2));if(!S(A,b))throw new Error("bad point: is not on curve");return{x:A,y:b}}else throw new Error(`bad point: got length ${x}, expected compressed=${h} or uncompressed=${u}`)}const _=e.toBytes||f,E=e.fromBytes||y;function O(P){const h=t.sqr(P),u=t.mul(h,P);return t.add(t.add(u,t.mul(P,o.a)),o.b)}function S(P,h){const u=t.sqr(h),x=O(P);return t.eql(u,x)}if(!S(o.Gx,o.Gy))throw new Error("bad curve params: generator point");const C=t.mul(t.pow(o.a,Pe),Bs),U=t.mul(t.sqr(o.b),BigInt(27));if(t.is0(t.add(C,U)))throw new Error("bad curve params: a or b");function F(P,h,u=!1){if(!t.isValid(h)||u&&t.is0(h))throw new Error(`bad point coordinate ${P}`);return h}function B(P){if(!(P instanceof j))throw new Error("Weierstrass Point expected")}function q(P){if(!c||!c.basises)throw new Error("no endo");return Ps(P,c.basises,n.ORDER)}const z=yt((P,h)=>{const{X:u,Y:x,Z:v}=P;if(t.eql(v,t.ONE))return{x:u,y:x};const I=P.is0();h==null&&(h=I?t.ONE:t.inv(v));const T=t.mul(u,h),A=t.mul(x,h),b=t.mul(v,h);if(I)return{x:t.ZERO,y:t.ZERO};if(!t.eql(b,t.ONE))throw new Error("invZ was invalid");return{x:T,y:A}}),we=yt(P=>{if(P.is0()){if(e.allowInfinityPoint&&!t.is0(P.Y))return;throw new Error("bad point: ZERO")}const{x:h,y:u}=P.toAffine();if(!t.isValid(h)||!t.isValid(u))throw new Error("bad point: x or y not field elements");if(!S(h,u))throw new Error("bad point: equation left != right");if(!P.isTorsionFree())throw new Error("bad point: not in prime-order subgroup");return!0});function ae(P,h,u,x,v){return u=new j(t.mul(u.X,P),u.Y,u.Z),h=Ue(x,h),u=Ue(v,u),h.add(u)}const L=class L{constructor(h,u,x){w(this,"X");w(this,"Y");w(this,"Z");this.X=F("x",h),this.Y=F("y",u,!0),this.Z=F("z",x),Object.freeze(this)}static CURVE(){return o}static fromAffine(h){const{x:u,y:x}=h||{};if(!h||!t.isValid(u)||!t.isValid(x))throw new Error("invalid affine point");if(h instanceof L)throw new Error("projective point not allowed");return t.is0(u)&&t.is0(x)?L.ZERO:new L(u,x,t.ONE)}static fromBytes(h){const u=L.fromAffine(E(M(h,void 0,"point")));return u.assertValidity(),u}static fromHex(h){return L.fromBytes(Me(h))}get x(){return this.toAffine().x}get y(){return this.toAffine().y}precompute(h=8,u=!0){return pe.createCache(this,h),u||this.multiply(Pe),this}assertValidity(){we(this)}hasEvenY(){const{y:h}=this.toAffine();if(!t.isOdd)throw new Error("Field doesn't support isOdd");return!t.isOdd(h)}equals(h){B(h);const{X:u,Y:x,Z:v}=this,{X:I,Y:T,Z:A}=h,b=t.eql(t.mul(u,A),t.mul(I,v)),R=t.eql(t.mul(x,A),t.mul(T,v));return b&&R}negate(){return new L(this.X,t.neg(this.Y),this.Z)}double(){const{a:h,b:u}=o,x=t.mul(u,Pe),{X:v,Y:I,Z:T}=this;let A=t.ZERO,b=t.ZERO,R=t.ZERO,k=t.mul(v,v),H=t.mul(I,I),$=t.mul(T,T),N=t.mul(v,I);return N=t.add(N,N),R=t.mul(v,T),R=t.add(R,R),A=t.mul(h,R),b=t.mul(x,$),b=t.add(A,b),A=t.sub(H,b),b=t.add(H,b),b=t.mul(A,b),A=t.mul(N,A),R=t.mul(x,R),$=t.mul(h,$),N=t.sub(k,$),N=t.mul(h,N),N=t.add(N,R),R=t.add(k,k),k=t.add(R,k),k=t.add(k,$),k=t.mul(k,N),b=t.add(b,k),$=t.mul(I,T),$=t.add($,$),k=t.mul($,N),A=t.sub(A,k),R=t.mul($,H),R=t.add(R,R),R=t.add(R,R),new L(A,b,R)}add(h){B(h);const{X:u,Y:x,Z:v}=this,{X:I,Y:T,Z:A}=h;let b=t.ZERO,R=t.ZERO,k=t.ZERO;const H=o.a,$=t.mul(o.b,Pe);let N=t.mul(u,I),G=t.mul(x,T),W=t.mul(v,A),Z=t.add(u,x),D=t.add(I,T);Z=t.mul(Z,D),D=t.add(N,G),Z=t.sub(Z,D),D=t.add(u,v);let V=t.add(I,A);return D=t.mul(D,V),V=t.add(N,W),D=t.sub(D,V),V=t.add(x,v),b=t.add(T,A),V=t.mul(V,b),b=t.add(G,W),V=t.sub(V,b),k=t.mul(H,D),b=t.mul($,W),k=t.add(b,k),b=t.sub(G,k),k=t.add(G,k),R=t.mul(b,k),G=t.add(N,N),G=t.add(G,N),W=t.mul(H,W),D=t.mul($,D),G=t.add(G,W),W=t.sub(N,W),W=t.mul(H,W),D=t.add(D,W),N=t.mul(G,D),R=t.add(R,N),N=t.mul(V,D),b=t.mul(Z,b),b=t.sub(b,N),N=t.mul(Z,G),k=t.mul(V,k),k=t.add(k,N),new L(b,R,k)}subtract(h){return this.add(h.negate())}is0(){return this.equals(L.ZERO)}multiply(h){const{endo:u}=e;if(!n.isValidNot0(h))throw new Error("invalid scalar: out of range");let x,v;const I=T=>pe.cached(this,T,A=>Et(L,A));if(u){const{k1neg:T,k1:A,k2neg:b,k2:R}=q(h),{p:k,f:H}=I(A),{p:$,f:N}=I(R);v=H.add(N),x=ae(u.beta,k,$,T,b)}else{const{p:T,f:A}=I(h);x=T,v=A}return Et(L,[x,v])[0]}multiplyUnsafe(h){const{endo:u}=e,x=this;if(!n.isValid(h))throw new Error("invalid scalar: out of range");if(h===ne||x.is0())return L.ZERO;if(h===ye)return x;if(pe.hasCache(this))return this.multiply(h);if(u){const{k1neg:v,k1:I,k2neg:T,k2:A}=q(h),{p1:b,p2:R}=Ns(L,x,I,A);return ae(u.beta,b,R,v,T)}else return pe.unsafe(x,h)}toAffine(h){return z(this,h)}isTorsionFree(){const{isTorsionFree:h}=e;return i===ye?!0:h?h(L,this):pe.unsafe(this,a).is0()}clearCofactor(){const{clearCofactor:h}=e;return i===ye?this:h?h(L,this):this.multiplyUnsafe(i)}isSmallOrder(){return this.multiplyUnsafe(i).is0()}toBytes(h=!0){return De(h,"isCompressed"),this.assertValidity(),_(L,this,h)}toHex(h=!0){return Ae(this.toBytes(h))}toString(){return`<Point ${this.is0()?"ZERO":this.toHex()}>`}};w(L,"BASE",new L(o.Gx,o.Gy,t.ONE)),w(L,"ZERO",new L(t.ZERO,t.ONE,t.ZERO)),w(L,"Fp",t),w(L,"Fn",n);let j=L;const Re=n.BITS,pe=new Os(j,e.endo?Math.ceil(Re/2):Re);return j.BASE.precompute(8),j}function or(s){return Uint8Array.of(s?2:3)}function ir(s,e){return{secretKey:e.BYTES,publicKey:1+s.BYTES,publicKeyUncompressed:1+2*s.BYTES,publicKeyHasPrefix:!0,signature:2*e.BYTES}}function Ms(s,e={}){const{Fn:r}=s,t=e.randomBytes||Ut,n=Object.assign(ir(s.Fp,r),{seed:Qt(r.ORDER)});function o(_){try{const E=r.fromBytes(_);return r.isValidNot0(E)}catch{return!1}}function i(_,E){const{publicKey:O,publicKeyUncompressed:S}=n;try{const C=_.length;return E===!0&&C!==O||E===!1&&C!==S?!1:!!s.fromBytes(_)}catch{return!1}}function a(_=t(n.seed)){return Rs(M(_,n.seed,"seed"),r.ORDER)}function c(_,E=!0){return s.BASE.multiply(r.fromBytes(_)).toBytes(E)}function l(_){const{secretKey:E,publicKey:O,publicKeyUncompressed:S}=n;if(!tt(_)||"_lengths"in r&&r._lengths||E===O)return;const C=M(_,void 0,"key").length;return C===O||C===S}function d(_,E,O=!0){if(l(_)===!0)throw new Error("first arg must be private key");if(l(E)===!1)throw new Error("second arg must be public key");const S=r.fromBytes(_);return s.fromBytes(E).multiply(S).toBytes(O)}const f={isValidSecretKey:o,isValidPublicKey:i,randomSecretKey:a},y=Cs(a,c);return Object.freeze({getPublicKey:c,getSharedSecret:d,keygen:y,Point:s,utils:f,lengths:n})}function Ds(s,e,r={}){Bt(e),ot(r,{},{hmac:"function",lowS:"boolean",randomBytes:"function",bits2int:"function",bits2int_modN:"function"}),r=Object.assign({},r);const t=r.randomBytes||Ut,n=r.hmac||((h,u)=>sr(e,h,u)),{Fp:o,Fn:i}=s,{ORDER:a,BITS:c}=i,{keygen:l,getPublicKey:d,getSharedSecret:f,utils:y,lengths:_}=Ms(s,r),E={prehash:!0,lowS:typeof r.lowS=="boolean"?r.lowS:!0,format:"compact",extraEntropy:!1},O=a*nr<o.ORDER;function S(h){const u=a>>ye;return h>u}function C(h,u){if(!i.isValidNot0(u))throw new Error(`invalid signature ${h}: out of range 1..Point.Fn.ORDER`);return u}function U(){if(O)throw new Error('"recovered" sig type is not supported for cofactor >2 curves')}function F(h,u){Xe(u);const x=_.signature,v=u==="compact"?x:u==="recovered"?x+1:void 0;return M(h,v)}class B{constructor(u,x,v){w(this,"r");w(this,"s");w(this,"recovery");if(this.r=C("r",u),this.s=C("s",x),v!=null){if(U(),![0,1,2,3].includes(v))throw new Error("invalid recovery id");this.recovery=v}Object.freeze(this)}static fromBytes(u,x=E.format){F(u,x);let v;if(x==="der"){const{r:b,s:R}=de.toSig(M(u));return new B(b,R)}x==="recovered"&&(v=u[0],x="compact",u=u.subarray(1));const I=_.signature/2,T=u.subarray(0,I),A=u.subarray(I,I*2);return new B(i.fromBytes(T),i.fromBytes(A),v)}static fromHex(u,x){return this.fromBytes(Me(u),x)}assertRecovery(){const{recovery:u}=this;if(u==null)throw new Error("invalid recovery id: must be present");return u}addRecoveryBit(u){return new B(this.r,this.s,u)}recoverPublicKey(u){const{r:x,s:v}=this,I=this.assertRecovery(),T=I===2||I===3?x+a:x;if(!o.isValid(T))throw new Error("invalid recovery id: sig.r+curve.n != R.x");const A=o.toBytes(T),b=s.fromBytes(ue(or((I&1)===0),A)),R=i.inv(T),k=z(M(u,void 0,"msgHash")),H=i.create(-k*R),$=i.create(v*R),N=s.BASE.multiplyUnsafe(H).add(b.multiplyUnsafe($));if(N.is0())throw new Error("invalid recovery: point at infinify");return N.assertValidity(),N}hasHighS(){return S(this.s)}toBytes(u=E.format){if(Xe(u),u==="der")return Me(de.hexFromSig(this));const{r:x,s:v}=this,I=i.toBytes(x),T=i.toBytes(v);return u==="recovered"?(U(),ue(Uint8Array.of(this.assertRecovery()),I,T)):ue(I,T)}toHex(u){return Ae(this.toBytes(u))}}const q=r.bits2int||function(u){if(u.length>8192)throw new Error("input is too large");const x=qe(u),v=u.length*8-c;return v>0?x>>BigInt(v):x},z=r.bits2int_modN||function(u){return i.create(q(u))},we=nt(c);function ae(h){return ps("num < 2^"+c,h,ne,we),i.toBytes(h)}function j(h,u){return M(h,void 0,"message"),u?M(e(h),void 0,"prehashed message"):h}function Re(h,u,x){const{lowS:v,prehash:I,extraEntropy:T}=Ye(x,E);h=j(h,I);const A=z(h),b=i.fromBytes(u);if(!i.isValidNot0(b))throw new Error("invalid private key");const R=[ae(b),ae(A)];if(T!=null&&T!==!1){const N=T===!0?t(_.secretKey):T;R.push(M(N,void 0,"extraEntropy"))}const k=ue(...R),H=A;function $(N){const G=q(N);if(!i.isValidNot0(G))return;const W=i.inv(G),Z=s.BASE.multiply(G).toAffine(),D=i.create(Z.x);if(D===ne)return;const V=i.create(W*i.create(H+D*b));if(V===ne)return;let dt=(Z.x===D?0:2)|Number(Z.y&ye),ut=V;return v&&S(V)&&(ut=i.neg(V),dt^=1),new B(D,ut,O?void 0:dt)}return{seed:k,k2sig:$}}function pe(h,u,x={}){const{seed:v,k2sig:I}=Re(h,u,x);return _s(e.outputLen,i.BYTES,n)(v,I).toBytes(x.format)}function L(h,u,x,v={}){const{lowS:I,prehash:T,format:A}=Ye(v,E);if(x=M(x,void 0,"publicKey"),u=j(u,T),!tt(h)){const b=h instanceof B?", use sig.toBytes()":"";throw new Error("verify expects Uint8Array signature"+b)}F(h,A);try{const b=B.fromBytes(h,A),R=s.fromBytes(x);if(I&&b.hasHighS())return!1;const{r:k,s:H}=b,$=z(u),N=i.inv(H),G=i.create($*N),W=i.create(k*N),Z=s.BASE.multiplyUnsafe(G).add(R.multiplyUnsafe(W));return Z.is0()?!1:i.create(Z.x)===k}catch{return!1}}function P(h,u,x={}){const{prehash:v}=Ye(x,E);return u=j(u,v),B.fromBytes(h,"recovered").recoverPublicKey(u).toBytes()}return Object.freeze({keygen:l,getPublicKey:d,getSharedSecret:f,utils:y,lengths:_,Point:s,sign:pe,verify:L,recoverPublicKey:P,Signature:B,hash:e})}/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const at={p:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:BigInt(1),a:BigInt(0),b:BigInt(7),Gx:BigInt("0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"),Gy:BigInt("0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8")},Us={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),basises:[[BigInt("0x3086d221a7d46bcde86c90e49284eb15"),-BigInt("0xe4437ed6010e88286f547fa90abfe4c3")],[BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),BigInt("0x3086d221a7d46bcde86c90e49284eb15")]]},Rt=BigInt(2);function Hs(s){const e=at.p,r=BigInt(3),t=BigInt(6),n=BigInt(11),o=BigInt(22),i=BigInt(23),a=BigInt(44),c=BigInt(88),l=s*s*s%e,d=l*l*s%e,f=J(d,r,e)*d%e,y=J(f,r,e)*d%e,_=J(y,Rt,e)*l%e,E=J(_,n,e)*_%e,O=J(E,o,e)*E%e,S=J(O,a,e)*O%e,C=J(S,c,e)*S%e,U=J(C,a,e)*O%e,F=J(U,r,e)*d%e,B=J(F,i,e)*E%e,q=J(B,t,e)*l%e,z=J(q,Rt,e);if(!Je.eql(Je.sqr(z),s))throw new Error("Cannot find square root");return z}const Je=Ge(at.p,{sqrt:Hs}),Fs=$s(at,{Fp:Je,endo:Us}),qs=Ds(Fs,hs),Gs=BigInt(0),Te=BigInt(1),Ws=BigInt(2),Vs=BigInt(7),Ks=BigInt(256),zs=BigInt(113),ar=[],cr=[],lr=[];for(let s=0,e=Te,r=1,t=0;s<24;s++){[r,t]=[t,(2*r+3*t)%5],ar.push(2*(5*t+r)),cr.push((s+1)*(s+2)/2%64);let n=Gs;for(let o=0;o<7;o++)e=(e<<Te^(e>>Vs)*zs)%Ks,e&Ws&&(n^=Te<<(Te<<BigInt(o))-Te);lr.push(n)}const dr=ns(lr,!0),js=dr[0],Ys=dr[1],Ot=(s,e,r)=>r>32?as(s,e,r):os(s,e,r),Nt=(s,e,r)=>r>32?cs(s,e,r):is(s,e,r);function Zs(s,e=24){const r=new Uint32Array(10);for(let t=24-e;t<24;t++){for(let i=0;i<10;i++)r[i]=s[i]^s[i+10]^s[i+20]^s[i+30]^s[i+40];for(let i=0;i<10;i+=2){const a=(i+8)%10,c=(i+2)%10,l=r[c],d=r[c+1],f=Ot(l,d,1)^r[a],y=Nt(l,d,1)^r[a+1];for(let _=0;_<50;_+=10)s[i+_]^=f,s[i+_+1]^=y}let n=s[2],o=s[3];for(let i=0;i<24;i++){const a=cr[i],c=Ot(n,o,a),l=Nt(n,o,a),d=ar[i];n=s[d],o=s[d+1],s[d]=c,s[d+1]=l}for(let i=0;i<50;i+=10){for(let a=0;a<10;a++)r[a]=s[i+a];for(let a=0;a<10;a++)s[i+a]^=~r[(a+2)%10]&r[(a+4)%10]}s[0]^=js[t],s[1]^=Ys[t]}ve(r)}class ct{constructor(e,r,t,n=!1,o=24){w(this,"state");w(this,"pos",0);w(this,"posOut",0);w(this,"finished",!1);w(this,"state32");w(this,"destroyed",!1);w(this,"blockLen");w(this,"suffix");w(this,"outputLen");w(this,"enableXOF",!1);w(this,"rounds");if(this.blockLen=e,this.suffix=r,this.outputLen=t,this.enableXOF=n,this.rounds=o,ie(t,"outputLen"),!(0<e&&e<200))throw new Error("only keccak-f1600 function is supported");this.state=new Uint8Array(200),this.state32=jr(this.state)}clone(){return this._cloneInto()}keccak(){_t(this.state32),Zs(this.state32,this.rounds),_t(this.state32),this.posOut=0,this.pos=0}update(e){be(this),M(e);const{blockLen:r,state:t}=this,n=e.length;for(let o=0;o<n;){const i=Math.min(r-this.pos,n-o);for(let a=0;a<i;a++)t[this.pos++]^=e[o++];this.pos===r&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;const{state:e,suffix:r,pos:t,blockLen:n}=this;e[t]^=r,r&128&&t===n-1&&this.keccak(),e[n-1]^=128,this.keccak()}writeInto(e){be(this,!1),M(e),this.finish();const r=this.state,{blockLen:t}=this;for(let n=0,o=e.length;n<o;){this.posOut>=t&&this.keccak();const i=Math.min(t-this.posOut,o-n);e.set(r.subarray(this.posOut,this.posOut+i),n),this.posOut+=i,n+=i}return e}xofInto(e){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(e)}xof(e){return ie(e),this.xofInto(new Uint8Array(e))}digestInto(e){if($t(e,this),this.finished)throw new Error("digest() was already called");return this.writeInto(e),this.destroy(),e}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,ve(this.state)}_cloneInto(e){const{blockLen:r,suffix:t,outputLen:n,rounds:o,enableXOF:i}=this;return e||(e=new ct(r,t,n,i,o)),e.state32.set(this.state32),e.pos=this.pos,e.posOut=this.posOut,e.finished=this.finished,e.rounds=o,e.suffix=t,e.outputLen=n,e.enableXOF=i,e.destroyed=this.destroyed,e}}const Xs=(s,e,r,t={})=>Dt(()=>new ct(e,s,r),t),kt=Xs(1,136,32);class Js{async verifyJWT(e,r){try{const t=this.decodeJWT(e);g.log("[CROSSx] JWT 디코딩 성공:",{sub:t.sub,exp:t.exp,iat:t.iat,"현재 시간":Math.floor(Date.now()/1e3)});const n=Math.floor(Date.now()/1e3);return t.exp&&t.exp<n?(g.warn("[CROSSx] 토큰 만료:",{exp:t.exp,now:n,만료시간:new Date(t.exp*1e3).toISOString()}),{payload:t,valid:!1,signatureVerified:!1}):t.sub?(g.log("[CROSSx] JWT 검증 성공 (서명 미검증 — JWKS 미구현)"),{payload:t,valid:!0,signatureVerified:!1}):(g.warn("[CROSSx] JWT에 sub(사용자ID) 없음"),{payload:t,valid:!1,signatureVerified:!1})}catch(t){throw g.error("[CROSSx] JWT 검증 중 에러:",t),t}}decodeJWT(e){return fr.decodeJwt(e)}recoverPersonalSignSigner(e,r){const t=new TextEncoder().encode(e),n=new TextEncoder().encode(`Ethereum Signed Message:
939
+ ${t.length}`),o=new Uint8Array(n.length+t.length);o.set(n,0),o.set(t,n.length);const i=kt(o),a=r.startsWith("0x")?r.slice(2):r;if(a.length!==130)throw new Error(`Invalid signature length: expected 130 hex chars, got ${a.length}`);const c=Qs(a),l=c.slice(0,32),d=c.slice(32,64),f=c[64],y=f>=27?f-27:f,O=new qs.Signature(Ct(l),Ct(d)).addRecoveryBit(y).recoverPublicKey(i).toBytes(!1).slice(1),S=kt(O);return"0x"+Ae(S.slice(12))}}function Qs(s){const e=new Uint8Array(s.length/2);for(let r=0;r<e.length;r++)e[r]=parseInt(s.substring(r*2,r*2+2),16);return e}function Ct(s){let e="0x";for(const r of s)e+=r.toString(16).padStart(2,"0");return BigInt(e)}const en=3e4;class tn{async request(e){const r=new AbortController,t=setTimeout(()=>r.abort(),e.timeoutMs??en);try{const n=await fetch(e.url,{method:e.method,headers:e.headers,body:e.body?JSON.stringify(e.body):void 0,signal:r.signal}),o=await n.json();return{status:n.status,data:o,headers:Object.fromEntries(n.headers.entries())}}finally{clearTimeout(t)}}}class lt{static generateState(){const e=new Uint8Array(16);return crypto.getRandomValues(e),Array.from(e,r=>r.toString(16).padStart(2,"0")).join("")}openAuth(e){return new Promise((r,t)=>{const n=e.width??500,o=e.height??600,i=window.screenX+(window.outerWidth-n)/2,a=window.screenY+(window.outerHeight-o)/2,c=lt.generateState(),l=e.authUrl.includes("?")?"&":"?",d=`${e.authUrl}${l}state=${c}`,f=window.open(d,"CROSSx OAuth",`width=${n},height=${o},left=${i},top=${a}`);if(!f){t(new Error("팝업 창을 열 수 없습니다. 팝업 차단을 해제해 주세요."));return}const y=setTimeout(()=>{E(),t(new Error("Authentication timeout"))},5*60*1e3),_=setInterval(()=>{try{f.closed&&(g.log("[CROSSx] 팝업이 닫혔습니다"),E(),t(new Error("로그인이 취소되었습니다")))}catch{}},1e3),E=()=>{clearTimeout(y),clearInterval(_),window.removeEventListener("message",O)},O=S=>{var U,F,B,q,z,we,ae;if(S.origin!==e.expectedOrigin)return;E(),g.log("[CROSSx] OAuth postMessage 수신 — status:",S.data.status);const C=S.data.state??((U=S.data.data)==null?void 0:U.state);if(C&&C!==c){t(new Error("OAuth state mismatch — possible CSRF attack"));return}if(S.data.status==="success"){const j=((F=S.data.data)==null?void 0:F.accessToken)||((B=S.data.data)==null?void 0:B.idToken);g.log("[CROSSx] OAuth 토큰 수신:",{hasAccessToken:!!((q=S.data.data)!=null&&q.accessToken),hasIdToken:!!((z=S.data.data)!=null&&z.idToken)}),j?r(j):(g.error("[CROSSx] 토큰을 찾을 수 없음:",S.data),t(new Error("Token not found in response")))}else g.error("[CROSSx] OAuth 실패:",(we=S.data.data)==null?void 0:we.error),t(new Error(((ae=S.data.data)==null?void 0:ae.error)||"Authentication failed"))};window.addEventListener("message",O)})}}const Le="crossx_wallet_data";class rn{constructor(e){this.storage=e}async getOrCreateWallet(e){try{const r=await this.storage.get(Le);if(r)return r;const t={id:e,address:this.generateMockEvmAddress(),derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()};return await this.storage.set(Le,t),t}catch(r){throw new m(p.WALLET_CREATION_FAILED,"Wallet creation failed",r)}}async getAddress(e,r){return{address:this.generateMockEvmAddress(),derivationPath:`m/44'/60'/0'/0/${r}`}}async getBalance(e,r){return"0x0"}async getTransactionCount(e,r){return 0}async getTransactionReceipt(e,r){return null}async rpcRequest(e,r,t){return g.log(`[Mock] rpcRequest: ${e}`),null}async prepare(e,r){const t="mock-"+crypto.randomUUID();return g.log(`[Mock] prepare action=${e} → uuid=${t}`),{uuid:t,expiresAt:new Date(Date.now()+5*6e4).toISOString()}}async signMessage(e,r,t,n=0,o,i){return g.log(`[Mock] signMessage chainId=${r} index=${n} uuid=${o} from=${i}: "${t}"`),{chainId:r,signature:this.generateMockSignature(),format:"hex"}}async signTypedData(e,r,t,n=0,o,i){return g.log(`[Mock] signTypedData chainId=${r} index=${n} uuid=${o} from=${i}`),{chainId:r,signature:this.generateMockSignature(),format:"hex"}}async signTransaction(e,r,t,n=0,o){g.log(`[Mock] signTransaction chainId=${r} index=${n} uuid=${o}:`,t);const i="0x"+Array(64).fill(0).map(()=>Math.floor(Math.random()*16).toString(16)).join("");return{chainId:r,signature:this.generateMockSignature(),txHash:i,format:"hex"}}async sendTransaction(e,r,t,n){return g.log(`[Mock] sendTransaction chainId=${r} uuid=${n}:`,t),{txHash:"0x"+Array(64).fill(0).map(()=>Math.floor(Math.random()*16).toString(16)).join("")}}async withdraw(e){g.log("[Mock] withdraw confirmation:",e)}async recoverWallet(e,r){g.log("[Mock] recoverWallet");const t={id:e,address:this.generateMockEvmAddress(),derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()};return await this.storage.set(Le,t),t}async migrateWallet(e,r){g.log(`[Mock] migrateWallet pin=${e} sub=${r}`);const t={id:r,address:this.generateMockEvmAddress(),derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()};return await this.storage.set(Le,t),t}generateMockEvmAddress(){return"0x"+Array(40).fill(0).map(()=>Math.floor(Math.random()*16).toString(16)).join("")}generateMockSignature(){return"0x"+Array(130).fill(0).map(()=>Math.floor(Math.random()*16).toString(16)).join("")}}class He{constructor(e,r,t,n){this.baseUrl=e.gatewayUrl,this.projectId=e.projectId,this.appId=e.appId,this.appType=e.appType,this.storage=r,this.transport=t,this.tokenStore=n}getAuthToken(){const e=this.tokenStore.get();if(!e)throw new m(p.AUTH_NOT_AUTHENTICATED,"No auth token found. Please sign in first.");return e}async request(e,r,t){var a,c;const n=this.getAuthToken(),o=`${this.baseUrl}${r}`,i={Authorization:`Bearer ${n}`,"Content-Type":"application/json","X-Project-Id":this.projectId};this.appId&&(i["X-App-Id"]=this.appId,i["X-App-Type"]=this.appType);try{const d=(await this.transport.request({url:o,method:e,headers:i,body:t??void 0})).data;if(d&&typeof d.code=="number"){if(d.code<0||d.code>=400){const f=d.message||d.data||"API request failed";g.error("[CROSSx] Wallet Gateway API 에러 (HTTP 200):",{code:d.code,message:f,url:o,method:e,fullResponse:d});const y=He.mapGatewayError(d.code),_=He.getGatewayErrorMessage(d.code,f),E=new m(y,_);throw E.gatewayCode=d.code,E.gatewayMessage=f,E}return g.log("[CROSSx] Wallet Gateway API 성공:",{code:d.code,url:o,method:e}),d.data??d}return d}catch(l){if(l instanceof m)throw l;if((a=l.response)!=null&&a.data){const d=l.response.data,f=d.message||d.data||"API request failed",y=d.code||"UNKNOWN";throw g.error("[CROSSx] Wallet Gateway API 에러 (HTTP 에러):",{code:y,message:f,url:o,method:e,status:(c=l.response)==null?void 0:c.status}),new m(p.UNKNOWN_ERROR,`Wallet Gateway error (${y}): ${f}`)}throw l}}async getOrCreateWallet(e){var r;g.log("[CROSSx][Migration Phase 2] GET /mnemonic/addresses — 기존 지갑 조회");try{const t=await this.request("GET","/mnemonic/addresses");if(t.addresses&&t.addresses.length>0){const{address:n}=t.addresses[0];return g.log("[CROSSx][Migration Phase 2] 기존 지갑 발견 — address:",n),{id:e,address:n,derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()}}}catch{g.log("[CROSSx][Migration Phase 2] 기존 지갑 없음, POST /mnemonic/create 진행")}g.log("[CROSSx][Migration Phase 2] POST /mnemonic/create — ignoreBackup: false");try{const t={ignoreBackup:!1},n=await this.request("POST","/mnemonic/create",t);return g.log("[CROSSx][Migration Phase 2] /mnemonic/create 성공 — address:",n.address),{id:e,address:n.address,derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()}}catch(t){if((t==null?void 0:t.gatewayCode)===-10004||(r=t==null?void 0:t.message)!=null&&r.includes("-10004")){g.log("[CROSSx][Migration Phase 2] 지갑 이미 존재 (-10004), 주소 재조회");const n=await this.request("GET","/mnemonic/addresses");if(n.addresses&&n.addresses.length>0)return{id:e,address:n.addresses[0].address,derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()}}throw(t==null?void 0:t.gatewayCode)===-10012&&g.log("[CROSSx][Migration Phase 2] Gateway -10012 수신 → MIGRATION_BACKUP_EXISTS throw"),t}}async getAddress(e,r){try{return{address:(await this.request("GET",`/mnemonic/address?index=${r}`)).address,derivationPath:`m/44'/60'/0'/0/${r}`}}catch(t){if(t instanceof m&&this.isAddressNotFoundError(t))return g.log(`[CROSSx] index ${r} 주소 없음, 파생 중...`),{address:(await this.request("GET",`/mnemonic/address?index=${r}&derive=true`)).address,derivationPath:`m/44'/60'/0'/0/${r}`};throw t}}isAddressNotFoundError(e){const r=e.message.toLowerCase();return r.includes("404")||r.includes("not found")||r.includes("찾을 수 없")||r.includes("does not exist")||r.includes("no address")}async rpcCall(e,r,t){const n={jsonrpc:"2.0",method:e,params:r,id:Date.now()},o=await this.request("POST",`/wallet/rpc/${encodeURIComponent(t)}`,n);if(o!=null&&o.error)throw new m(p.UNKNOWN_ERROR,`RPC call failed (${e}): ${o.error.message}`);return o==null?void 0:o.result}async getBalance(e,r){return await this.rpcCall("eth_getBalance",[e,"latest"],r)??"0x0"}async getTransactionCount(e,r){const t=await this.rpcCall("eth_getTransactionCount",[e,"pending"],r);return parseInt(t??"0x0",16)}async getTransactionReceipt(e,r){return await this.rpcCall("eth_getTransactionReceipt",[e],r)??null}async rpcRequest(e,r,t){return this.rpcCall(e,r,t)}async prepare(e,r){let t;switch(e){case"sign":case"send":if(!r.tx)throw new m(p.TX_INVALID_PARAMS,"prepare: tx is required");t={unsignedTx:this.buildUnsignedTx(r.tx)};break;case"sign-message":if(!r.message)throw new m(p.TX_INVALID_PARAMS,"prepare: message is required");t={message:r.message},r.from&&(t.from=r.from);break;case"sign-typed-data":if(!r.typedData)throw new m(p.TX_INVALID_PARAMS,"prepare: typedData is required");t={typedData:r.typedData},r.from&&(t.from=r.from);break}const n={action:e,params:t},o=await this.request("POST","/mnemonic/prepare",n);return{uuid:o.uuid,expiresAt:o.expiresAt}}async signMessage(e,r,t,n,o,i){const a={message:t};o&&(a.uuid=o),i&&(a.from=i);const c=await this.request("POST","/mnemonic/sign-message",a);return{chainId:r,signature:c.signature,format:"hex"}}async signTypedData(e,r,t,n,o,i){const a={typedData:t};o&&(a.uuid=o),i&&(a.from=i);const c=await this.request("POST","/mnemonic/sign-typed-data",a);return{chainId:r,signature:c.signature,format:"hex"}}buildUnsignedTx(e){return{from:e.from,to:e.to,value:e.value,data:e.data,nonce:e.nonce!==void 0?`0x${e.nonce.toString(16)}`:void 0,gasLimit:e.gasLimit,gasPrice:e.gasPrice,maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas,chainId:e.chainId!==void 0?`0x${e.chainId.toString(16)}`:void 0}}async signTransaction(e,r,t,n,o){const i={unsignedTx:this.buildUnsignedTx(t)};o&&(i.uuid=o);const a=await this.request("POST",`/mnemonic/sign/${encodeURIComponent(r)}`,i);return{chainId:r,signature:a.signedTx,txHash:a.txHash,format:"hex"}}async sendTransaction(e,r,t,n){const o={unsignedTx:this.buildUnsignedTx(t)};return n&&(o.uuid=n),{txHash:(await this.request("POST",`/mnemonic/send/${encodeURIComponent(r)}`,o)).txHash}}async withdraw(e){const r={confirmation:e};if(!(await this.request("POST","/mnemonic/withdraw",r)).success)throw new m(p.UNKNOWN_ERROR,"Wallet withdrawal failed")}async recoverWallet(e,r){const t={shareC:r},n=await this.request("POST","/mnemonic/recover",t);return{id:e,address:n.address,newShareC:n.newShareC,derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()}}async migrateWallet(e,r){g.log("[CROSSx][Migration Phase 4] POST /mnemonic/migrate 호출 — sub:",r);const t={pin:e,sub:r},n=await this.request("POST","/mnemonic/migrate",t);return g.log("[CROSSx][Migration Phase 4] /mnemonic/migrate 완료 — address:",n.address),{id:r,address:n.address,derivationPath:"m/44'/60'/0'/0/0",createdAt:Date.now()}}static mapGatewayError(e){switch(e){case-10002:return p.AUTH_NOT_AUTHENTICATED;case-10001:case-10009:return p.UNKNOWN_ERROR;case-10006:return p.GATEWAY_INTERNAL_ERROR;case-10008:return p.GATEWAY_LOCK_CONFLICT;case-10010:return p.MIGRATION_FAILED;case-10012:return p.MIGRATION_BACKUP_EXISTS;case-10022:return p.PROJECT_NOT_REGISTERED;case-10023:return p.PROJECT_ID_MISSING;case-10024:return p.ORIGIN_OR_APP_ID_MISSING;case-10025:return p.INVALID_APP_TYPE;case-10014:case-10015:case-10019:return p.PREPARE_FAILED;case-10016:return p.PREPARE_EXPIRED;case-10017:case-10018:return p.PREPARE_MISMATCH;default:return p.UNKNOWN_ERROR}}static getGatewayErrorMessage(e,r){switch(e){case-10002:return"Session expired. Please sign in again.";case-10006:return"Internal server error. Please try again later.";case-10008:return"Another operation is in progress. Please try again later.";case-10022:return"This project or origin is not registered. Check your projectId and allowed origins in the management console.";case-10023:return"Project ID is required. Set the projectId field in SDKConfig.";case-10024:return"Origin or App ID is required. Web requests need a valid Origin; native apps need appId and appType in SDKConfig.";case-10025:return'Invalid app type. appType must be "ios" or "android".';default:return`Request failed (${e}): ${r}`}}}class sn{constructor(){this._accessToken=null}set(e){this._accessToken=e}get(){return this._accessToken}clear(){this._accessToken=null}has(){return this._accessToken!==null}}const nn="https://cross-wallet-oauth.crosstoken.io",on="https://cross-auth.crosstoken.io",an="https://embedded-wallet-gateway.crosstoken.io/api/v1";function cn(){return nn}function ln(){return on}function dn(){return an}function un(s){s.debug;const e=cn(),r=ln(),t=dn(),n={...s,oauthServiceUrl:e,authApiUrl:r,walletGatewayUrl:t},o=new zr,i=new Js,a=new tn,c=new lt,l=new sn;let d;return s.useMockWallet?(g.log("[CROSSx] Mock Wallet Provider 사용"),d=new rn(o)):(g.log("[CROSSx] Remote Wallet Provider 사용"),d=new He({gatewayUrl:t,projectId:s.projectId,appId:s.appId,appType:s.appType},o,a,l)),new $e(n,o,i,a,c,d,l)}const hn={CROSS_MAINNET:"eip155:612055",CROSS_TESTNET:"eip155:612044",ETHEREUM_MAINNET:"eip155:1",ETHEREUM_SEPOLIA:"eip155:11155111",ETHEREUM_HOLESKY:"eip155:17000",POLYGON_MAINNET:"eip155:137",POLYGON_AMOY:"eip155:80002",BSC_MAINNET:"eip155:56",BSC_TESTNET:"eip155:97",ARBITRUM_ONE:"eip155:42161",ARBITRUM_SEPOLIA:"eip155:421614",OPTIMISM_MAINNET:"eip155:10",OPTIMISM_SEPOLIA:"eip155:11155420",BASE_MAINNET:"eip155:8453",BASE_SEPOLIA:"eip155:84532"};exports.CROSSxError=m;exports.CROSSxEthereumProvider=Pt;exports.CROSSxSDK=$e;exports.ChainId=hn;exports.ErrorCode=p;exports.createCROSSxSDK=un;