@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.
- package/dist/accounts/index.amd.js +306 -0
- package/dist/accounts/index.cjs.cjs +2 -2
- package/dist/accounts/index.esm.js +2 -2
- package/dist/autogen/index.amd.js +151 -0
- package/dist/autogen/index.cjs.cjs +2 -2
- package/dist/autogen/index.esm.js +2 -2
- package/dist/chunks/account-BSrvZ7S8.js +77 -0
- package/dist/chunks/address-class-Dp7aNQb2.js +18 -0
- package/dist/chunks/base-B_kRRfsf.js +27 -0
- package/dist/chunks/debugWalletActions-BDz-h2tl.js +993 -0
- package/dist/chunks/{keystore-BFVSylSw.js → keystore-BMgBWq6G.js} +1 -1
- package/dist/chunks/{keystore-BbK5pVrh.cjs → keystore-CjcbAa1r.cjs} +1 -1
- package/dist/chunks/keystore-D7_ZZNzS.js +143 -0
- package/dist/chunks/{lclib-C2eG5HzD.js → lclib-BlnZKIGv.js} +43 -27
- package/dist/chunks/lclib-DBHaYcY8.js +3854 -0
- package/dist/chunks/{lclib-DuoOR0-Q.cjs → lclib-xRDGxtgw.cjs} +52 -36
- package/dist/chunks/rpc-C4n7t9y0.js +25 -0
- package/dist/chunks/transport-BBAz1kmP.js +30 -0
- package/dist/chunks/tslib.es6-D29rxPkW.js +37 -0
- package/dist/chunks/tx-type-CS4wIUJ8.js +68 -0
- package/dist/chunks/wasm-BCEa0JCQ.js +213 -0
- package/dist/chunks/{wasm-BtPcXTR4.js → wasm-C4WNl2YQ.js} +1 -1
- package/dist/chunks/{wasm-DTyHBxcY.cjs → wasm-D4S52Ifh.cjs} +1 -1
- package/dist/clients/index.amd.js +97 -0
- package/dist/clients/index.cjs.cjs +1 -1
- package/dist/clients/index.esm.js +1 -1
- package/dist/constant/index.amd.js +458 -0
- package/dist/contracts/index.amd.js +19640 -0
- package/dist/contracts/index.cjs.cjs +2 -2
- package/dist/contracts/index.esm.js +2 -2
- package/dist/errors/index.amd.js +17 -0
- package/dist/index.amd.js +43 -0
- package/dist/index.cjs.cjs +3 -3
- package/dist/index.esm.js +3 -3
- package/dist/transports/index.amd.js +98 -0
- package/dist/utils/index.amd.js +353 -0
- package/dist/utils/index.cjs.cjs +3 -3
- package/dist/utils/index.esm.js +4 -4
- package/dist/vite-plugin/index.amd.js +186 -0
- package/dist/vite-plugin/index.cjs.cjs +189 -0
- package/dist/vite-plugin/index.d.cts +46 -0
- package/dist/vite-plugin/index.d.mts +46 -0
- package/dist/vite-plugin/index.esm.js +183 -0
- package/dist/webpack-plugin/index.amd.js +101 -0
- package/dist/webpack-plugin/index.cjs.cjs +104 -0
- package/dist/webpack-plugin/index.d.cts +46 -0
- package/dist/webpack-plugin/index.d.mts +46 -0
- package/dist/webpack-plugin/index.esm.js +98 -0
- package/package.json +36 -6
- package/dist/index.umd.d.mts +0 -15
- 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-
|
|
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
|
|
|
@@ -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
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
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(
|
|
3174
|
-
get(
|
|
3175
|
-
get(
|
|
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
|
-
|
|
3792
|
-
|
|
3793
|
-
|
|
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(
|
|
3812
|
+
const lclibBytesPromise = get(lclibUrl);
|
|
3797
3813
|
let lclibBytes;
|
|
3798
3814
|
try {
|
|
3799
3815
|
[, lclibBytes] = yield Promise.all([cryptoPromise, lclibBytesPromise]);
|