@weblock-wallet/sdk 0.1.43 → 0.1.45
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/index.cjs +240 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +240 -60
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.d.cts
CHANGED
|
@@ -12,6 +12,8 @@ declare enum SDKErrorCode {
|
|
|
12
12
|
WALLET_ALREADY_EXISTS = "WALLET_ALREADY_EXISTS",
|
|
13
13
|
WALLET_CREATION_FAILED = "WALLET_CREATION_FAILED",
|
|
14
14
|
INVALID_PASSWORD = "INVALID_PASSWORD",
|
|
15
|
+
RECOVERY_NOT_AVAILABLE = "RECOVERY_NOT_AVAILABLE",
|
|
16
|
+
PIN_RESET_FAILED = "PIN_RESET_FAILED",
|
|
15
17
|
ASSET_NOT_FOUND = "ASSET_NOT_FOUND",
|
|
16
18
|
INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
|
|
17
19
|
TRANSFER_FAILED = "TRANSFER_FAILED",
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ declare enum SDKErrorCode {
|
|
|
12
12
|
WALLET_ALREADY_EXISTS = "WALLET_ALREADY_EXISTS",
|
|
13
13
|
WALLET_CREATION_FAILED = "WALLET_CREATION_FAILED",
|
|
14
14
|
INVALID_PASSWORD = "INVALID_PASSWORD",
|
|
15
|
+
RECOVERY_NOT_AVAILABLE = "RECOVERY_NOT_AVAILABLE",
|
|
16
|
+
PIN_RESET_FAILED = "PIN_RESET_FAILED",
|
|
15
17
|
ASSET_NOT_FOUND = "ASSET_NOT_FOUND",
|
|
16
18
|
INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
|
|
17
19
|
TRANSFER_FAILED = "TRANSFER_FAILED",
|
package/dist/index.js
CHANGED
|
@@ -103990,6 +103990,8 @@ var SDKErrorCode = /* @__PURE__ */ ((SDKErrorCode2) => {
|
|
|
103990
103990
|
SDKErrorCode2["WALLET_ALREADY_EXISTS"] = "WALLET_ALREADY_EXISTS";
|
|
103991
103991
|
SDKErrorCode2["WALLET_CREATION_FAILED"] = "WALLET_CREATION_FAILED";
|
|
103992
103992
|
SDKErrorCode2["INVALID_PASSWORD"] = "INVALID_PASSWORD";
|
|
103993
|
+
SDKErrorCode2["RECOVERY_NOT_AVAILABLE"] = "RECOVERY_NOT_AVAILABLE";
|
|
103994
|
+
SDKErrorCode2["PIN_RESET_FAILED"] = "PIN_RESET_FAILED";
|
|
103993
103995
|
SDKErrorCode2["ASSET_NOT_FOUND"] = "ASSET_NOT_FOUND";
|
|
103994
103996
|
SDKErrorCode2["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
|
|
103995
103997
|
SDKErrorCode2["TRANSFER_FAILED"] = "TRANSFER_FAILED";
|
|
@@ -104106,6 +104108,16 @@ var ERC20_ABI = [
|
|
|
104106
104108
|
"function decimals() view returns (uint8)",
|
|
104107
104109
|
"function symbol() view returns (string)"
|
|
104108
104110
|
];
|
|
104111
|
+
var STORAGE_KEYS = {
|
|
104112
|
+
walletAddress: (orgHost) => `${orgHost}:walletAddress`,
|
|
104113
|
+
share2: (orgHost) => `${orgHost}:share2`,
|
|
104114
|
+
encryptedShare2: (orgHost) => `${orgHost}:encryptedShare2`,
|
|
104115
|
+
encryptedShare2Device: (orgHost) => `${orgHost}:encryptedShare2_device`,
|
|
104116
|
+
deviceSecret: (orgHost) => `${orgHost}:deviceSecret`,
|
|
104117
|
+
firebaseId: (orgHost) => `${orgHost}:firebaseId`,
|
|
104118
|
+
accessToken: (orgHost) => `${orgHost}:accessToken`,
|
|
104119
|
+
isNewUser: (orgHost) => `${orgHost}:isNewUser`
|
|
104120
|
+
};
|
|
104109
104121
|
var WalletService = class {
|
|
104110
104122
|
constructor(walletClient, rpcClient, orgHost, networkService) {
|
|
104111
104123
|
this.walletClient = walletClient;
|
|
@@ -104114,13 +104126,53 @@ var WalletService = class {
|
|
|
104114
104126
|
this.networkService = networkService;
|
|
104115
104127
|
this.walletAddress = null;
|
|
104116
104128
|
}
|
|
104129
|
+
/**
|
|
104130
|
+
* Wallet PIN/password mismatch handling.
|
|
104131
|
+
*/
|
|
104132
|
+
isInvalidPasswordError(error) {
|
|
104133
|
+
if (!error) return false;
|
|
104134
|
+
if (error instanceof Error) {
|
|
104135
|
+
const msg = (error.message || "").toLowerCase();
|
|
104136
|
+
return msg.includes("wrong password") || msg.includes("unable to decrypt") || msg.includes("bad decrypt") || msg.includes("invalid key");
|
|
104137
|
+
}
|
|
104138
|
+
try {
|
|
104139
|
+
const msg = String(error?.message ?? "").toLowerCase();
|
|
104140
|
+
return msg.includes("wrong password") || msg.includes("unable to decrypt") || msg.includes("bad decrypt") || msg.includes("invalid key");
|
|
104141
|
+
} catch {
|
|
104142
|
+
return false;
|
|
104143
|
+
}
|
|
104144
|
+
}
|
|
104145
|
+
isSixDigitPin(pin) {
|
|
104146
|
+
return /^[0-9]{6}$/.test(pin);
|
|
104147
|
+
}
|
|
104148
|
+
/**
|
|
104149
|
+
* deviceSecret은 "PIN과 무관한 로컬 복구용 비밀값"입니다.
|
|
104150
|
+
* - 같은 디바이스에서만 PIN reset이 가능하도록 하는 역할
|
|
104151
|
+
* - 서버에는 절대 전달하지 않습니다.
|
|
104152
|
+
*/
|
|
104153
|
+
async getOrCreateDeviceSecret() {
|
|
104154
|
+
const key = STORAGE_KEYS.deviceSecret(this.orgHost);
|
|
104155
|
+
const existing = await LocalForage.get(key);
|
|
104156
|
+
if (existing) return existing;
|
|
104157
|
+
const secret = randomBytes(32).toString("hex");
|
|
104158
|
+
await LocalForage.save(key, secret);
|
|
104159
|
+
return secret;
|
|
104160
|
+
}
|
|
104161
|
+
async ensureDeviceEncryptedShare2(share2Plain, firebaseId) {
|
|
104162
|
+
const encryptedKey = STORAGE_KEYS.encryptedShare2Device(this.orgHost);
|
|
104163
|
+
const existing = await LocalForage.get(encryptedKey);
|
|
104164
|
+
if (existing) return;
|
|
104165
|
+
const deviceSecret = await this.getOrCreateDeviceSecret();
|
|
104166
|
+
const encrypted = Crypto.encryptShare(share2Plain, deviceSecret, firebaseId);
|
|
104167
|
+
await LocalForage.save(encryptedKey, encrypted);
|
|
104168
|
+
}
|
|
104117
104169
|
async getAddress() {
|
|
104118
104170
|
try {
|
|
104119
104171
|
if (this.walletAddress) {
|
|
104120
104172
|
return this.walletAddress;
|
|
104121
104173
|
}
|
|
104122
104174
|
const savedAddress = await LocalForage.get(
|
|
104123
|
-
|
|
104175
|
+
STORAGE_KEYS.walletAddress(this.orgHost)
|
|
104124
104176
|
);
|
|
104125
104177
|
if (savedAddress) {
|
|
104126
104178
|
this.walletAddress = savedAddress;
|
|
@@ -104130,7 +104182,7 @@ var WalletService = class {
|
|
|
104130
104182
|
if (walletInfo?.address) {
|
|
104131
104183
|
this.walletAddress = walletInfo.address;
|
|
104132
104184
|
await LocalForage.save(
|
|
104133
|
-
|
|
104185
|
+
STORAGE_KEYS.walletAddress(this.orgHost),
|
|
104134
104186
|
walletInfo.address
|
|
104135
104187
|
);
|
|
104136
104188
|
return walletInfo.address;
|
|
@@ -104147,7 +104199,7 @@ var WalletService = class {
|
|
|
104147
104199
|
async create(password) {
|
|
104148
104200
|
try {
|
|
104149
104201
|
const firebaseId = await LocalForage.get(
|
|
104150
|
-
|
|
104202
|
+
STORAGE_KEYS.firebaseId(this.orgHost)
|
|
104151
104203
|
);
|
|
104152
104204
|
console.log("1. FirebaseId:", firebaseId);
|
|
104153
104205
|
if (!firebaseId) {
|
|
@@ -104156,8 +104208,14 @@ var WalletService = class {
|
|
|
104156
104208
|
if (!password) {
|
|
104157
104209
|
throw new SDKError("Password is required", "INVALID_PARAMS" /* INVALID_PARAMS */);
|
|
104158
104210
|
}
|
|
104211
|
+
if (!this.isSixDigitPin(password)) {
|
|
104212
|
+
throw new SDKError(
|
|
104213
|
+
"PIN must be a 6-digit number",
|
|
104214
|
+
"INVALID_PARAMS" /* INVALID_PARAMS */
|
|
104215
|
+
);
|
|
104216
|
+
}
|
|
104159
104217
|
const isNewUser = await LocalForage.get(
|
|
104160
|
-
|
|
104218
|
+
STORAGE_KEYS.isNewUser(this.orgHost)
|
|
104161
104219
|
);
|
|
104162
104220
|
if (!isNewUser) {
|
|
104163
104221
|
throw new SDKError(
|
|
@@ -104176,21 +104234,15 @@ var WalletService = class {
|
|
|
104176
104234
|
console.log("4. Splitting private key...");
|
|
104177
104235
|
const shares = await Secrets.split(wallet.privateKey, 3, 2);
|
|
104178
104236
|
const [share1, share2, share3] = shares;
|
|
104179
|
-
console.log("5. Shares created:", {
|
|
104180
|
-
share1Length: share1.length,
|
|
104181
|
-
share2Length: share2.length,
|
|
104182
|
-
share3Length: share3.length
|
|
104183
|
-
});
|
|
104184
104237
|
console.log("6. Encrypting shares...");
|
|
104185
104238
|
const encryptedShare2 = Crypto.encryptShare(share2, password, firebaseId);
|
|
104186
104239
|
const encryptedShare3 = Crypto.encryptShare(share3, password, firebaseId);
|
|
104187
|
-
console.log("7. Shares encrypted:", {
|
|
104188
|
-
encryptedShare2Length: encryptedShare2.length,
|
|
104189
|
-
encryptedShare3Length: encryptedShare3.length
|
|
104190
|
-
});
|
|
104191
104240
|
console.log("8. Saving encryptedShare2 to LocalForage...");
|
|
104192
|
-
await LocalForage.save(
|
|
104193
|
-
|
|
104241
|
+
await LocalForage.save(
|
|
104242
|
+
STORAGE_KEYS.encryptedShare2(this.orgHost),
|
|
104243
|
+
encryptedShare2
|
|
104244
|
+
);
|
|
104245
|
+
await this.ensureDeviceEncryptedShare2(share2, firebaseId);
|
|
104194
104246
|
console.log("10. Creating wallet on server...");
|
|
104195
104247
|
await this.walletClient.createWallet({
|
|
104196
104248
|
address: wallet.address,
|
|
@@ -104198,9 +104250,11 @@ var WalletService = class {
|
|
|
104198
104250
|
share1,
|
|
104199
104251
|
encryptedShare3
|
|
104200
104252
|
});
|
|
104201
|
-
console.log("11. Wallet created on server");
|
|
104202
104253
|
this.walletAddress = wallet.address;
|
|
104203
|
-
await LocalForage.save(
|
|
104254
|
+
await LocalForage.save(
|
|
104255
|
+
STORAGE_KEYS.walletAddress(this.orgHost),
|
|
104256
|
+
wallet.address
|
|
104257
|
+
);
|
|
104204
104258
|
return wallet.address;
|
|
104205
104259
|
} catch (error) {
|
|
104206
104260
|
console.error("Error in create wallet:", error);
|
|
@@ -104215,44 +104269,54 @@ var WalletService = class {
|
|
|
104215
104269
|
async retrieveWallet(password) {
|
|
104216
104270
|
try {
|
|
104217
104271
|
const accessToken = await LocalForage.get(
|
|
104218
|
-
|
|
104272
|
+
STORAGE_KEYS.accessToken(this.orgHost)
|
|
104219
104273
|
);
|
|
104220
104274
|
if (!accessToken) {
|
|
104221
104275
|
throw new SDKError("Access token not found", "AUTH_REQUIRED" /* AUTH_REQUIRED */);
|
|
104222
104276
|
}
|
|
104223
|
-
console.log("1. Checking login status...");
|
|
104224
104277
|
const firebaseId = await LocalForage.get(
|
|
104225
|
-
|
|
104278
|
+
STORAGE_KEYS.firebaseId(this.orgHost)
|
|
104226
104279
|
);
|
|
104227
104280
|
if (!firebaseId) {
|
|
104228
104281
|
throw new SDKError("Not logged in", "AUTH_REQUIRED" /* AUTH_REQUIRED */);
|
|
104229
104282
|
}
|
|
104230
|
-
|
|
104283
|
+
if (!this.isSixDigitPin(password)) {
|
|
104284
|
+
throw new SDKError(
|
|
104285
|
+
"PIN must be a 6-digit number",
|
|
104286
|
+
"INVALID_PARAMS" /* INVALID_PARAMS */
|
|
104287
|
+
);
|
|
104288
|
+
}
|
|
104289
|
+
const decryptShareOrThrow = (encryptedShare) => {
|
|
104290
|
+
try {
|
|
104291
|
+
return Crypto.decryptShare(encryptedShare, password, firebaseId);
|
|
104292
|
+
} catch (e7) {
|
|
104293
|
+
if (this.isInvalidPasswordError(e7)) {
|
|
104294
|
+
throw new SDKError(
|
|
104295
|
+
"Incorrect PIN code",
|
|
104296
|
+
"INVALID_PASSWORD" /* INVALID_PASSWORD */,
|
|
104297
|
+
e7
|
|
104298
|
+
);
|
|
104299
|
+
}
|
|
104300
|
+
throw e7;
|
|
104301
|
+
}
|
|
104302
|
+
};
|
|
104231
104303
|
const walletInfo = await this.walletClient.getWallet();
|
|
104232
|
-
|
|
104233
|
-
|
|
104304
|
+
let share2 = await LocalForage.get(
|
|
104305
|
+
STORAGE_KEYS.share2(this.orgHost)
|
|
104306
|
+
);
|
|
104234
104307
|
if (!share2) {
|
|
104235
104308
|
const encryptedShare2 = await LocalForage.get(
|
|
104236
|
-
|
|
104309
|
+
STORAGE_KEYS.encryptedShare2(this.orgHost)
|
|
104237
104310
|
);
|
|
104238
104311
|
if (encryptedShare2) {
|
|
104239
|
-
share2 =
|
|
104240
|
-
await LocalForage.save(
|
|
104312
|
+
share2 = decryptShareOrThrow(encryptedShare2);
|
|
104313
|
+
await LocalForage.save(STORAGE_KEYS.share2(this.orgHost), share2);
|
|
104241
104314
|
} else {
|
|
104242
|
-
|
|
104243
|
-
const share3 = Crypto.decryptShare(
|
|
104244
|
-
walletInfo.encryptedShare3,
|
|
104245
|
-
password,
|
|
104246
|
-
firebaseId
|
|
104247
|
-
);
|
|
104248
|
-
console.log("9. Share3 decrypted, combining with share1...");
|
|
104315
|
+
const share3 = decryptShareOrThrow(walletInfo.encryptedShare3);
|
|
104249
104316
|
const privateKey2 = await Secrets.combine([walletInfo.share1, share3]);
|
|
104250
104317
|
const wallet2 = new Wallet(privateKey2);
|
|
104251
|
-
console.log("10. Generating new shares...");
|
|
104252
104318
|
const newShares = await Secrets.split(wallet2.privateKey, 3, 2);
|
|
104253
104319
|
const [newShare1, newShare2, newShare3] = newShares;
|
|
104254
|
-
console.log("11. New shares generated");
|
|
104255
|
-
console.log("12. Updating wallet keys on server...");
|
|
104256
104320
|
await this.walletClient.updateWalletKey({
|
|
104257
104321
|
share1: newShare1,
|
|
104258
104322
|
encryptedShare3: Crypto.encryptShare(
|
|
@@ -104261,28 +104325,34 @@ var WalletService = class {
|
|
|
104261
104325
|
firebaseId
|
|
104262
104326
|
)
|
|
104263
104327
|
});
|
|
104264
|
-
|
|
104265
|
-
await LocalForage.save(`${this.orgHost}:share2`, newShare2);
|
|
104328
|
+
await LocalForage.save(STORAGE_KEYS.share2(this.orgHost), newShare2);
|
|
104266
104329
|
await LocalForage.save(
|
|
104267
|
-
|
|
104330
|
+
STORAGE_KEYS.encryptedShare2(this.orgHost),
|
|
104268
104331
|
Crypto.encryptShare(newShare2, password, firebaseId)
|
|
104269
104332
|
);
|
|
104270
|
-
|
|
104333
|
+
await this.ensureDeviceEncryptedShare2(newShare2, firebaseId);
|
|
104271
104334
|
this.walletAddress = wallet2.address;
|
|
104272
|
-
|
|
104335
|
+
await LocalForage.save(
|
|
104336
|
+
STORAGE_KEYS.walletAddress(this.orgHost),
|
|
104337
|
+
wallet2.address
|
|
104338
|
+
);
|
|
104339
|
+
await LocalForage.delete(STORAGE_KEYS.share2(this.orgHost));
|
|
104273
104340
|
return wallet2.address;
|
|
104274
104341
|
}
|
|
104275
104342
|
}
|
|
104276
|
-
console.log("15. Combining share1 and share2...");
|
|
104277
104343
|
const privateKey = await Secrets.combine([walletInfo.share1, share2]);
|
|
104278
104344
|
const wallet = new Wallet(privateKey);
|
|
104345
|
+
await this.ensureDeviceEncryptedShare2(share2, firebaseId);
|
|
104279
104346
|
this.walletAddress = wallet.address;
|
|
104280
|
-
await LocalForage.save(
|
|
104281
|
-
|
|
104347
|
+
await LocalForage.save(
|
|
104348
|
+
STORAGE_KEYS.walletAddress(this.orgHost),
|
|
104349
|
+
wallet.address
|
|
104350
|
+
);
|
|
104351
|
+
await LocalForage.delete(STORAGE_KEYS.share2(this.orgHost));
|
|
104282
104352
|
return wallet.address;
|
|
104283
104353
|
} catch (error) {
|
|
104284
104354
|
this.walletAddress = null;
|
|
104285
|
-
await LocalForage.delete(
|
|
104355
|
+
await LocalForage.delete(STORAGE_KEYS.share2(this.orgHost));
|
|
104286
104356
|
console.error("Error in retrieveWallet:", error);
|
|
104287
104357
|
if (error instanceof SDKError) throw error;
|
|
104288
104358
|
throw new SDKError(
|
|
@@ -104292,11 +104362,109 @@ var WalletService = class {
|
|
|
104292
104362
|
);
|
|
104293
104363
|
}
|
|
104294
104364
|
}
|
|
104365
|
+
/**
|
|
104366
|
+
* NEW: PIN reset (프라이빗키/주소 유지)
|
|
104367
|
+
* - 같은 디바이스에 남아있는 encryptedShare2_device를 이용
|
|
104368
|
+
* - 서버는 PATCH /v1/wallets/keys 로 share1 / encryptedShare3 만 업데이트
|
|
104369
|
+
*/
|
|
104370
|
+
async resetPin(newPassword) {
|
|
104371
|
+
try {
|
|
104372
|
+
const accessToken = await LocalForage.get(
|
|
104373
|
+
STORAGE_KEYS.accessToken(this.orgHost)
|
|
104374
|
+
);
|
|
104375
|
+
if (!accessToken) {
|
|
104376
|
+
throw new SDKError("Access token not found", "AUTH_REQUIRED" /* AUTH_REQUIRED */);
|
|
104377
|
+
}
|
|
104378
|
+
const firebaseId = await LocalForage.get(
|
|
104379
|
+
STORAGE_KEYS.firebaseId(this.orgHost)
|
|
104380
|
+
);
|
|
104381
|
+
if (!firebaseId) {
|
|
104382
|
+
throw new SDKError("Not logged in", "AUTH_REQUIRED" /* AUTH_REQUIRED */);
|
|
104383
|
+
}
|
|
104384
|
+
if (!newPassword || !this.isSixDigitPin(newPassword)) {
|
|
104385
|
+
throw new SDKError(
|
|
104386
|
+
"PIN must be a 6-digit number",
|
|
104387
|
+
"INVALID_PARAMS" /* INVALID_PARAMS */
|
|
104388
|
+
);
|
|
104389
|
+
}
|
|
104390
|
+
const encryptedDevice = await LocalForage.get(
|
|
104391
|
+
STORAGE_KEYS.encryptedShare2Device(this.orgHost)
|
|
104392
|
+
);
|
|
104393
|
+
if (!encryptedDevice) {
|
|
104394
|
+
throw new SDKError(
|
|
104395
|
+
"PIN reset is not available on this device",
|
|
104396
|
+
"RECOVERY_NOT_AVAILABLE" /* RECOVERY_NOT_AVAILABLE */
|
|
104397
|
+
);
|
|
104398
|
+
}
|
|
104399
|
+
const deviceSecret = await LocalForage.get(
|
|
104400
|
+
STORAGE_KEYS.deviceSecret(this.orgHost)
|
|
104401
|
+
);
|
|
104402
|
+
if (!deviceSecret) {
|
|
104403
|
+
throw new SDKError(
|
|
104404
|
+
"PIN reset is not available on this device",
|
|
104405
|
+
"RECOVERY_NOT_AVAILABLE" /* RECOVERY_NOT_AVAILABLE */
|
|
104406
|
+
);
|
|
104407
|
+
}
|
|
104408
|
+
let share2;
|
|
104409
|
+
try {
|
|
104410
|
+
share2 = Crypto.decryptShare(encryptedDevice, deviceSecret, firebaseId);
|
|
104411
|
+
} catch (e7) {
|
|
104412
|
+
throw new SDKError(
|
|
104413
|
+
"PIN reset is not available on this device",
|
|
104414
|
+
"RECOVERY_NOT_AVAILABLE" /* RECOVERY_NOT_AVAILABLE */,
|
|
104415
|
+
e7
|
|
104416
|
+
);
|
|
104417
|
+
}
|
|
104418
|
+
const walletInfo = await this.walletClient.getWallet();
|
|
104419
|
+
const privateKey = await Secrets.combine([walletInfo.share1, share2]);
|
|
104420
|
+
const wallet = new Wallet(privateKey);
|
|
104421
|
+
const newShares = await Secrets.split(wallet.privateKey, 3, 2);
|
|
104422
|
+
const [newShare1, newShare2, newShare3] = newShares;
|
|
104423
|
+
await this.walletClient.updateWalletKey({
|
|
104424
|
+
share1: newShare1,
|
|
104425
|
+
encryptedShare3: Crypto.encryptShare(
|
|
104426
|
+
newShare3,
|
|
104427
|
+
newPassword,
|
|
104428
|
+
firebaseId
|
|
104429
|
+
)
|
|
104430
|
+
});
|
|
104431
|
+
await LocalForage.save(
|
|
104432
|
+
STORAGE_KEYS.encryptedShare2(this.orgHost),
|
|
104433
|
+
Crypto.encryptShare(newShare2, newPassword, firebaseId)
|
|
104434
|
+
);
|
|
104435
|
+
const newEncryptedDevice = Crypto.encryptShare(
|
|
104436
|
+
newShare2,
|
|
104437
|
+
deviceSecret,
|
|
104438
|
+
firebaseId
|
|
104439
|
+
);
|
|
104440
|
+
await LocalForage.save(
|
|
104441
|
+
STORAGE_KEYS.encryptedShare2Device(this.orgHost),
|
|
104442
|
+
newEncryptedDevice
|
|
104443
|
+
);
|
|
104444
|
+
this.walletAddress = wallet.address;
|
|
104445
|
+
await LocalForage.save(
|
|
104446
|
+
STORAGE_KEYS.walletAddress(this.orgHost),
|
|
104447
|
+
wallet.address
|
|
104448
|
+
);
|
|
104449
|
+
await LocalForage.delete(STORAGE_KEYS.share2(this.orgHost));
|
|
104450
|
+
return wallet.address;
|
|
104451
|
+
} catch (error) {
|
|
104452
|
+
console.error("Error in resetPin:", error);
|
|
104453
|
+
if (error instanceof SDKError) throw error;
|
|
104454
|
+
throw new SDKError(
|
|
104455
|
+
"Failed to reset PIN",
|
|
104456
|
+
"PIN_RESET_FAILED" /* PIN_RESET_FAILED */,
|
|
104457
|
+
error
|
|
104458
|
+
);
|
|
104459
|
+
}
|
|
104460
|
+
}
|
|
104295
104461
|
async clearWalletState() {
|
|
104296
104462
|
this.walletAddress = null;
|
|
104297
|
-
await LocalForage.delete(
|
|
104298
|
-
await LocalForage.delete(
|
|
104299
|
-
await LocalForage.delete(
|
|
104463
|
+
await LocalForage.delete(STORAGE_KEYS.walletAddress(this.orgHost));
|
|
104464
|
+
await LocalForage.delete(STORAGE_KEYS.share2(this.orgHost));
|
|
104465
|
+
await LocalForage.delete(STORAGE_KEYS.encryptedShare2(this.orgHost));
|
|
104466
|
+
await LocalForage.delete(STORAGE_KEYS.encryptedShare2Device(this.orgHost));
|
|
104467
|
+
await LocalForage.delete(STORAGE_KEYS.deviceSecret(this.orgHost));
|
|
104300
104468
|
}
|
|
104301
104469
|
async getBalance(address, chainId) {
|
|
104302
104470
|
const response = await this.rpcClient.sendRpc({
|
|
@@ -104453,7 +104621,7 @@ var WalletService = class {
|
|
|
104453
104621
|
}
|
|
104454
104622
|
const [share1, share2] = await Promise.all([
|
|
104455
104623
|
this.walletClient.getWallet().then((wallet2) => wallet2.share1),
|
|
104456
|
-
LocalForage.get(
|
|
104624
|
+
LocalForage.get(STORAGE_KEYS.share2(this.orgHost))
|
|
104457
104625
|
]);
|
|
104458
104626
|
if (!share1 || !share2) {
|
|
104459
104627
|
throw new SDKError(
|
|
@@ -105949,6 +106117,7 @@ var InternalCoreImpl = class {
|
|
|
105949
106117
|
getAddress: () => this.walletService.getAddress(),
|
|
105950
106118
|
create: (password) => this.walletService.create(password),
|
|
105951
106119
|
retrieveWallet: (password) => this.walletService.retrieveWallet(password),
|
|
106120
|
+
resetPin: (newPassword) => this.walletService.resetPin(newPassword),
|
|
105952
106121
|
getBalance: (address, chainId) => this.walletService.getBalance(address, chainId),
|
|
105953
106122
|
getTokenBalance: (tokenAddress, walletAddress, chainId) => this.walletService.getTokenBalance(tokenAddress, walletAddress, chainId),
|
|
105954
106123
|
sendTransaction: (params) => this.walletService.sendTransaction(params),
|
|
@@ -105970,21 +106139,20 @@ var InternalCoreImpl = class {
|
|
|
105970
106139
|
};
|
|
105971
106140
|
this.asset = {
|
|
105972
106141
|
transfer: (params) => this.assetService.transfer(params),
|
|
105973
|
-
|
|
105974
|
-
|
|
106142
|
+
/**
|
|
106143
|
+
* ✅ 타입 정합성:
|
|
106144
|
+
* - InternalCore는 decimals?: number
|
|
106145
|
+
* - 기존 AssetService 내부 구현이 decimals를 string으로 받는 경우가 있어,
|
|
106146
|
+
* 여기서 안전하게 string으로 변환해서 전달합니다.
|
|
106147
|
+
*/
|
|
106148
|
+
addToken: (params) => this.assetService.addToken({
|
|
106149
|
+
...params,
|
|
106150
|
+
decimals: typeof params.decimals === "number" ? String(params.decimals) : void 0
|
|
106151
|
+
}),
|
|
105975
106152
|
getTokenBalance: (params) => this.assetService.getTokenBalance(params),
|
|
105976
106153
|
approveToken: (params) => this.assetService.approveToken(params),
|
|
105977
106154
|
getAllowance: (params) => this.assetService.getAllowance(params),
|
|
105978
|
-
// getTokenInfo: (params: TokenInfoParams) =>
|
|
105979
|
-
// this.assetService.getTokenInfo(params),
|
|
105980
106155
|
addNFTCollection: (params) => this.assetService.addNFTCollection(params),
|
|
105981
|
-
// checkSecurityTokenCompliance: (params: {
|
|
105982
|
-
// networkId: string
|
|
105983
|
-
// tokenAddress: string
|
|
105984
|
-
// from: string
|
|
105985
|
-
// to: string
|
|
105986
|
-
// amount: string
|
|
105987
|
-
// }) => this.assetService.checkSecurityTokenCompliance(params),
|
|
105988
106156
|
on: (event, listener) => this.assetService.on(event, listener),
|
|
105989
106157
|
off: (event, listener) => this.assetService.off(event, listener),
|
|
105990
106158
|
getTokenInfo: (params) => this.assetService.getTokenInfo(params),
|
|
@@ -106073,6 +106241,18 @@ var UserModule = class {
|
|
|
106073
106241
|
const wallet = await this.walletModule.getInfo();
|
|
106074
106242
|
return { wallet };
|
|
106075
106243
|
}
|
|
106244
|
+
/**
|
|
106245
|
+
* PIN을 모르는 상태에서 같은 디바이스에 남아있는 복구용 share2(encryptedShare2_device)로
|
|
106246
|
+
* PIN을 재설정합니다. (프라이빗키/주소 유지)
|
|
106247
|
+
*/
|
|
106248
|
+
async resetPin(newPassword) {
|
|
106249
|
+
if (!newPassword) {
|
|
106250
|
+
throw new SDKError("Password is required", "INVALID_PARAMS" /* INVALID_PARAMS */);
|
|
106251
|
+
}
|
|
106252
|
+
await this.core.wallet.resetPin(newPassword);
|
|
106253
|
+
const wallet = await this.walletModule.getInfo();
|
|
106254
|
+
return { wallet };
|
|
106255
|
+
}
|
|
106076
106256
|
async signOut() {
|
|
106077
106257
|
return this.core.auth.signOut();
|
|
106078
106258
|
}
|