@locuschain/lib 0.1.38 → 0.1.39

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 (51) hide show
  1. package/dist/accounts/index.amd.js +306 -0
  2. package/dist/accounts/index.cjs.cjs +2 -2
  3. package/dist/accounts/index.esm.js +2 -2
  4. package/dist/autogen/index.amd.js +151 -0
  5. package/dist/autogen/index.cjs.cjs +2 -2
  6. package/dist/autogen/index.esm.js +2 -2
  7. package/dist/chunks/account-BSrvZ7S8.js +77 -0
  8. package/dist/chunks/address-class-Dp7aNQb2.js +18 -0
  9. package/dist/chunks/base-B_kRRfsf.js +27 -0
  10. package/dist/chunks/debugWalletActions-BDz-h2tl.js +993 -0
  11. package/dist/chunks/{keystore-BFVSylSw.js → keystore-BMgBWq6G.js} +1 -1
  12. package/dist/chunks/{keystore-BbK5pVrh.cjs → keystore-CjcbAa1r.cjs} +1 -1
  13. package/dist/chunks/keystore-D7_ZZNzS.js +143 -0
  14. package/dist/chunks/{lclib-C2eG5HzD.js → lclib-BlnZKIGv.js} +43 -27
  15. package/dist/chunks/lclib-DBHaYcY8.js +3854 -0
  16. package/dist/chunks/{lclib-DuoOR0-Q.cjs → lclib-xRDGxtgw.cjs} +52 -36
  17. package/dist/chunks/rpc-C4n7t9y0.js +25 -0
  18. package/dist/chunks/transport-BBAz1kmP.js +30 -0
  19. package/dist/chunks/tslib.es6-D29rxPkW.js +37 -0
  20. package/dist/chunks/tx-type-CS4wIUJ8.js +68 -0
  21. package/dist/chunks/wasm-BCEa0JCQ.js +213 -0
  22. package/dist/chunks/{wasm-BtPcXTR4.js → wasm-C4WNl2YQ.js} +1 -1
  23. package/dist/chunks/{wasm-DTyHBxcY.cjs → wasm-D4S52Ifh.cjs} +1 -1
  24. package/dist/clients/index.amd.js +97 -0
  25. package/dist/clients/index.cjs.cjs +1 -1
  26. package/dist/clients/index.esm.js +1 -1
  27. package/dist/constant/index.amd.js +458 -0
  28. package/dist/contracts/index.amd.js +19640 -0
  29. package/dist/contracts/index.cjs.cjs +2 -2
  30. package/dist/contracts/index.esm.js +2 -2
  31. package/dist/errors/index.amd.js +17 -0
  32. package/dist/index.amd.js +43 -0
  33. package/dist/index.cjs.cjs +3 -3
  34. package/dist/index.esm.js +3 -3
  35. package/dist/transports/index.amd.js +98 -0
  36. package/dist/utils/index.amd.js +353 -0
  37. package/dist/utils/index.cjs.cjs +3 -3
  38. package/dist/utils/index.esm.js +4 -4
  39. package/dist/vite-plugin/index.amd.js +186 -0
  40. package/dist/vite-plugin/index.cjs.cjs +189 -0
  41. package/dist/vite-plugin/index.d.cts +46 -0
  42. package/dist/vite-plugin/index.d.mts +46 -0
  43. package/dist/vite-plugin/index.esm.js +183 -0
  44. package/dist/webpack-plugin/index.amd.js +101 -0
  45. package/dist/webpack-plugin/index.cjs.cjs +104 -0
  46. package/dist/webpack-plugin/index.d.cts +46 -0
  47. package/dist/webpack-plugin/index.d.mts +46 -0
  48. package/dist/webpack-plugin/index.esm.js +98 -0
  49. package/package.json +36 -6
  50. package/dist/index.umd.d.mts +0 -15
  51. package/dist/umd/index.umd.js +0 -26296
@@ -1,4 +1,4 @@
1
- import { c as createAccountAndKeystore, l as loadMasterKeystore, a as loadNormalKeystore } from './wasm-BtPcXTR4.js';
1
+ import { c as createAccountAndKeystore, l as loadMasterKeystore, a as loadNormalKeystore } from './wasm-C4WNl2YQ.js';
2
2
  import { B as BaseError } from './base-BQXfRsuw.js';
3
3
  import { D as DegenerateKeyError } from './account-FZT9LH_s.js';
4
4
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var wasm = require('./wasm-DTyHBxcY.cjs');
3
+ var wasm = require('./wasm-D4S52Ifh.cjs');
4
4
  var base = require('./base-Cy5SSYLF.cjs');
5
5
  var account = require('./account-BAsiKnSL.cjs');
6
6
 
@@ -0,0 +1,143 @@
1
+ define(['exports', './wasm-BCEa0JCQ', './base-B_kRRfsf', './account-BSrvZ7S8'], (function (exports, wasm, base, account) { 'use strict';
2
+
3
+ /**
4
+ * 새 dual-key keystore 를 만들고 결과 JSON array 를 master / normal 두
5
+ * 반쪽으로 분리한다. 각 반쪽은 독립적으로 영속화한 뒤 unlockMasterKeystore
6
+ * / unlockNormalKeystore 로 다시 unlock 할 수 있다.
7
+ *
8
+ * WASM 의 `createAccountAndKeystore` 에 대한 얇은 래퍼다. `utils/index.mts`
9
+ * 가 raw WASM export 도 함께 re-export 하므로 충돌을 피하려고 이름을
10
+ * 새로 붙였다.
11
+ */
12
+ function createKeystoreBundle(args) {
13
+ var _a, _b;
14
+ const raw = wasm.createAccountAndKeystore({
15
+ passwordMaster: args.passwordMaster,
16
+ passwordNormal: args.passwordNormal,
17
+ algoMaster: (_a = args.algoMaster) !== null && _a !== void 0 ? _a : '',
18
+ algoNormal: (_b = args.algoNormal) !== null && _b !== void 0 ? _b : '',
19
+ });
20
+ const { masterKsJson, normalKsJson } = splitKeystoreBundle(raw);
21
+ return { raw, masterKsJson, normalKsJson };
22
+ }
23
+ /**
24
+ * WASM `createAccountAndKeystore` 헬퍼가 반환한 `[master, normal]` keystore
25
+ * 배열을 두 JSON 문자열로 분리한다.
26
+ */
27
+ function splitKeystoreBundle(bundleJson) {
28
+ let parsed;
29
+ try {
30
+ parsed = JSON.parse(bundleJson);
31
+ }
32
+ catch (err) {
33
+ throw new base.BaseError('splitKeystoreBundle: bundle is not valid JSON', { cause: err });
34
+ }
35
+ if (!Array.isArray(parsed) || parsed.length !== 2) {
36
+ throw new base.BaseError(`splitKeystoreBundle: expected a JSON array of length 2, got length ${Array.isArray(parsed) ? parsed.length : 'n/a'}`);
37
+ }
38
+ return {
39
+ masterKsJson: JSON.stringify(parsed[0]),
40
+ normalKsJson: JSON.stringify(parsed[1]),
41
+ };
42
+ }
43
+ /**
44
+ * master keystore JSON 을 password 로 복호화한다.
45
+ *
46
+ * WASM 헬퍼가 emit 하는 lowercase-camelCase 필드 (`address`, `mkeyAlgorithm`,
47
+ * `msecretKey`, `mpublicKey`) 를 그대로 반환한다.
48
+ */
49
+ function unlockMasterKeystore(args) {
50
+ const raw = wasm.loadMasterKeystore({
51
+ passStr: args.password,
52
+ ksJson: args.ksJson,
53
+ });
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(raw);
57
+ }
58
+ catch (err) {
59
+ throw new base.BaseError('unlockMasterKeystore: WASM returned non-JSON', { cause: err });
60
+ }
61
+ assertField(parsed, 'address', 'unlockMasterKeystore');
62
+ assertField(parsed, 'msecretKey', 'unlockMasterKeystore');
63
+ assertField(parsed, 'mpublicKey', 'unlockMasterKeystore');
64
+ return parsed;
65
+ }
66
+ /**
67
+ * normal keystore JSON 을 password 로 복호화한다.
68
+ *
69
+ * WASM 헬퍼가 emit 하는 lowercase-camelCase 필드 (`address`, `nkeyAlgorithm`,
70
+ * `nsecretKey`, `npublicKey`, `keyBind`) 를 그대로 반환한다.
71
+ */
72
+ function unlockNormalKeystore(args) {
73
+ const raw = wasm.loadNormalKeystore({
74
+ passStr: args.password,
75
+ ksJson: args.ksJson,
76
+ });
77
+ let parsed;
78
+ try {
79
+ parsed = JSON.parse(raw);
80
+ }
81
+ catch (err) {
82
+ throw new base.BaseError('unlockNormalKeystore: WASM returned non-JSON', { cause: err });
83
+ }
84
+ assertField(parsed, 'address', 'unlockNormalKeystore');
85
+ assertField(parsed, 'nsecretKey', 'unlockNormalKeystore');
86
+ assertField(parsed, 'npublicKey', 'unlockNormalKeystore');
87
+ return parsed;
88
+ }
89
+ /**
90
+ * one-shot 헬퍼: 전체 `[master, normal]` keystore JSON 과 두 password 를
91
+ * 받아 `keysToAccount` 가 소비하는 평탄한 (address, msk, mpk, nsk, npk)
92
+ * tuple 을 반환한다.
93
+ */
94
+ function unlockKeystoreBundle(args) {
95
+ const halves = typeof args.ksJsonBundle === 'string'
96
+ ? splitKeystoreBundle(args.ksJsonBundle)
97
+ : {
98
+ masterKsJson: args.ksJsonBundle.masterKsJson,
99
+ normalKsJson: args.ksJsonBundle.normalKsJson,
100
+ };
101
+ const master = unlockMasterKeystore({
102
+ ksJson: halves.masterKsJson,
103
+ password: args.passwordMaster,
104
+ });
105
+ const normal = unlockNormalKeystore({
106
+ ksJson: halves.normalKsJson,
107
+ password: args.passwordNormal,
108
+ });
109
+ if (master.address !== normal.address) {
110
+ throw new base.BaseError(`unlockKeystoreBundle: keystore address mismatch (master=${master.address} normal=${normal.address})`);
111
+ }
112
+ if (master.mpublicKey === normal.npublicKey) {
113
+ throw new account.DegenerateKeyError({
114
+ source: 'unlockKeystoreBundle',
115
+ algoMaster: master.mkeyAlgorithm,
116
+ algoNormal: normal.nkeyAlgorithm,
117
+ });
118
+ }
119
+ return {
120
+ address: master.address,
121
+ msk: master.msecretKey,
122
+ mpk: master.mpublicKey,
123
+ nsk: normal.nsecretKey,
124
+ npk: normal.npublicKey,
125
+ };
126
+ }
127
+ function assertField(obj, key, fn) {
128
+ if (!obj || typeof obj !== 'object') {
129
+ throw new base.BaseError(`${fn}: WASM result is not an object`);
130
+ }
131
+ const v = obj[key];
132
+ if (typeof v !== 'string' || v.length === 0) {
133
+ throw new base.BaseError(`${fn}: WASM result missing '${key}'`);
134
+ }
135
+ }
136
+
137
+ exports.createKeystoreBundle = createKeystoreBundle;
138
+ exports.splitKeystoreBundle = splitKeystoreBundle;
139
+ exports.unlockKeystoreBundle = unlockKeystoreBundle;
140
+ exports.unlockMasterKeystore = unlockMasterKeystore;
141
+ exports.unlockNormalKeystore = unlockNormalKeystore;
142
+
143
+ }));
@@ -3147,32 +3147,41 @@ globalThis.js_haetae_verify = function (sigBuf, msgBuf, pkBuf) {
3147
3147
  haetaeC._free(pkPtr);
3148
3148
  return { ret: ret };
3149
3149
  };
3150
+ // 정적 리터럴 URL — Vite/Rollup/Webpack5 가 `new URL(<리터럴>, import.meta.url)` 패턴을
3151
+ // 정적 분석해서 사용자 빌드의 자산 그래프에 wasm 을 자동 등록할 수 있도록 모듈 최상위에서 선언.
3152
+ // override (baseUrl/urls) 가 없을 때만 사용된다.
3153
+ const DEFAULT_AIMER_URL = new URL('../autogen/wasm/crypto_aimer.wasm', import.meta.url);
3154
+ const DEFAULT_SMAUGT_URL = new URL('../autogen/wasm/crypto_smaugt.wasm', import.meta.url);
3155
+ const DEFAULT_HAETAE_URL = new URL('../autogen/wasm/crypto_haetae.wasm', import.meta.url);
3150
3156
  // AIMER / SMAUGT / HAETAE 의 .wasm 바이너리를 외부에서 받아와 Emscripten 모듈에 주입한다.
3151
3157
  // Module({ wasmBinary }) 가 주어지면 글루는 자체 fetch 를 건너뛰고 그 바이트를 사용한다.
3152
3158
  //
3153
3159
  // opts:
3154
3160
  // baseUrl?: URL | string — 기본은 이 파일이 위치한 디렉토리(=dist/utils/...) 기준 ./autogen/wasm/.
3155
- // 번들 후 디렉토리 구조가 달라지면 호출자가 명시 주입해야 한다.
3156
3161
  // urls?: { aimer, smaugt, haetae } — 개별 파일 override
3157
3162
  // fetcher?: (url: URL) => Promise<Uint8Array> — 완전 커스텀 (CDN/캐시/모킹)
3158
3163
  function loadCryptoWasm() {
3159
3164
  return __awaiter(this, arguments, void 0, function* (opts = {}) {
3160
3165
  var _a, _b, _c, _d;
3161
- // opts.baseUrl 이 주어지면 그대로 base 로 쓴다. import.meta.url 을 거치지 않는 이유:
3162
- // chrome-extension MV3 의 production 번들 환경에서 import.meta.url 이 빈 문자열로
3163
- // 치환될 수 있어 `new URL(abs, '')` 가 throw 한다. 호출자가 chrome.runtime.getURL()
3164
- // 같은 absolute URL 을 명시 주입한 경우엔 base resolution 자체가 불필요.
3165
- const base = opts.baseUrl
3166
- ? (opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl))
3167
- : new URL('../autogen/wasm/', import.meta.url);
3168
3166
  const get = (_a = opts.fetcher) !== null && _a !== void 0 ? _a : fetchWasmBytes;
3169
- const resolve = (override, name) => override
3170
- ? (override instanceof URL ? override : new URL(override, base))
3171
- : new URL(name, base);
3167
+ // 우선순위: opts.urls.* > opts.baseUrl > 정적 리터럴
3168
+ const pick = (override, defaultUrl, name) => {
3169
+ if (override) {
3170
+ const base = opts.baseUrl
3171
+ ? (opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl))
3172
+ : new URL('../autogen/wasm/', import.meta.url);
3173
+ return override instanceof URL ? override : new URL(override, base);
3174
+ }
3175
+ if (opts.baseUrl) {
3176
+ const base = opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl);
3177
+ return new URL(name, base);
3178
+ }
3179
+ return defaultUrl;
3180
+ };
3172
3181
  const [aimerBin, smaugtBin, haetaeBin] = yield Promise.all([
3173
- get(resolve((_b = opts.urls) === null || _b === void 0 ? void 0 : _b.aimer, 'crypto_aimer.wasm')),
3174
- get(resolve((_c = opts.urls) === null || _c === void 0 ? void 0 : _c.smaugt, 'crypto_smaugt.wasm')),
3175
- get(resolve((_d = opts.urls) === null || _d === void 0 ? void 0 : _d.haetae, 'crypto_haetae.wasm')),
3182
+ get(pick((_b = opts.urls) === null || _b === void 0 ? void 0 : _b.aimer, DEFAULT_AIMER_URL, 'crypto_aimer.wasm')),
3183
+ get(pick((_c = opts.urls) === null || _c === void 0 ? void 0 : _c.smaugt, DEFAULT_SMAUGT_URL, 'crypto_smaugt.wasm')),
3184
+ get(pick((_d = opts.urls) === null || _d === void 0 ? void 0 : _d.haetae, DEFAULT_HAETAE_URL, 'crypto_haetae.wasm')),
3176
3185
  ]);
3177
3186
  aimerC = yield AimerModule({ wasmBinary: aimerBin });
3178
3187
  smaugtC = yield SmaugtModule({ wasmBinary: smaugtBin });
@@ -3768,32 +3777,39 @@ if (globalThis[LCLIB_SEQ_KEY] === undefined) {
3768
3777
  globalThis[LCLIB_SEQ_KEY] += 1;
3769
3778
  const namespace = `wallet_${globalThis[LCLIB_SEQ_KEY]}`;
3770
3779
  const lclibWasmConfig = { namespace };
3780
+ // 정적 리터럴 URL — Vite/Rollup/Webpack5 가 `new URL(<리터럴>, import.meta.url)` 패턴을
3781
+ // 정적 분석해서 사용자 빌드의 자산 그래프에 wasm 을 자동 등록할 수 있도록 모듈 최상위에서 선언.
3782
+ // override (baseUrl/urls) 가 없을 때만 사용된다.
3783
+ const DEFAULT_LCLIB_URL = new URL('../autogen/wasm/lclib.wasm', import.meta.url);
3771
3784
  // .wasm 바이너리 4 개(lclib + AIMER/SMAUGT/HAETAE) 를 외부 파일에서 fetch 해서 로드한다.
3772
3785
  //
3773
3786
  // opts:
3774
3787
  // baseUrl?: URL | string — wasm 파일들이 놓인 베이스. 기본은 이 모듈 기준 ../autogen/wasm/.
3775
- // 번들 배포 후 디렉토리 구조가 바뀌면 호출자가 명시 주입해야 한다.
3776
3788
  // urls?: { lclib, aimer, smaugt, haetae } — 개별 파일 override (URL | string)
3777
3789
  // fetcher?: (url: URL) => Promise<Uint8Array> — 완전 커스텀 (CDN/캐시/모킹/Node 정적 경로)
3778
3790
  function load() {
3779
3791
  return __awaiter(this, arguments, void 0, function* (opts = {}) {
3780
3792
  var _a, _b;
3781
3793
  try {
3782
- console.log('[lclib.load] opts.baseUrl =', JSON.stringify(opts.baseUrl), 'typeof =', typeof opts.baseUrl, 'import.meta.url =', JSON.stringify(import.meta.url));
3783
- // opts.baseUrl 이 주어지면 그대로 base 로 쓴다. import.meta.url 을 거치지 않는 이유:
3784
- // chrome-extension MV3 의 production 번들 환경에서 import.meta.url 이 빈 문자열로
3785
- // 치환될 수 있어 `new URL(abs, '')` 가 throw 한다. 호출자가 chrome.runtime.getURL()
3786
- // 같은 absolute URL 을 명시 주입한 경우엔 base resolution 자체가 불필요.
3787
- const base = opts.baseUrl
3788
- ? (opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl))
3789
- : new URL('../autogen/wasm/', import.meta.url);
3790
3794
  const get = (_a = opts.fetcher) !== null && _a !== void 0 ? _a : fetchWasmBytes;
3791
- const resolve = (override, name) => override
3792
- ? (override instanceof URL ? override : new URL(override, base))
3793
- : new URL(name, base);
3795
+ // 우선순위: opts.urls.lclib > opts.baseUrl > 정적 리터럴
3796
+ let lclibUrl;
3797
+ if ((_b = opts.urls) === null || _b === void 0 ? void 0 : _b.lclib) {
3798
+ const base = opts.baseUrl
3799
+ ? (opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl))
3800
+ : new URL('../autogen/wasm/', import.meta.url);
3801
+ lclibUrl = opts.urls.lclib instanceof URL ? opts.urls.lclib : new URL(opts.urls.lclib, base);
3802
+ }
3803
+ else if (opts.baseUrl) {
3804
+ const base = opts.baseUrl instanceof URL ? opts.baseUrl : new URL(opts.baseUrl);
3805
+ lclibUrl = new URL('lclib.wasm', base);
3806
+ }
3807
+ else {
3808
+ lclibUrl = DEFAULT_LCLIB_URL;
3809
+ }
3794
3810
  // crypto WASM 3 종과 Go lclib WASM 을 병렬로 다운로드.
3795
3811
  const cryptoPromise = loadCryptoWasm(opts);
3796
- const lclibBytesPromise = get(resolve((_b = opts.urls) === null || _b === void 0 ? void 0 : _b.lclib, 'lclib.wasm'));
3812
+ const lclibBytesPromise = get(lclibUrl);
3797
3813
  let lclibBytes;
3798
3814
  try {
3799
3815
  [, lclibBytes] = yield Promise.all([cryptoPromise, lclibBytesPromise]);