@ecency/sdk 1.5.28 → 2.0.1
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/browser/index.d.ts +360 -2
- package/dist/browser/index.js +1579 -1293
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +1585 -1292
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +1579 -1293
- package/dist/node/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/node/index.cjs
CHANGED
|
@@ -258,67 +258,210 @@ function isNetworkError(error) {
|
|
|
258
258
|
const { type } = parseChainError(error);
|
|
259
259
|
return type === "network" /* NETWORK */ || type === "timeout" /* TIMEOUT */;
|
|
260
260
|
}
|
|
261
|
+
async function broadcastWithMethod(method, username, ops2, auth, authority = "posting", fetchedKey, fetchedToken) {
|
|
262
|
+
const adapter = auth?.adapter;
|
|
263
|
+
switch (method) {
|
|
264
|
+
case "key": {
|
|
265
|
+
if (!adapter) {
|
|
266
|
+
throw new Error("No adapter provided for key-based auth");
|
|
267
|
+
}
|
|
268
|
+
let key = fetchedKey;
|
|
269
|
+
if (key === void 0) {
|
|
270
|
+
switch (authority) {
|
|
271
|
+
case "owner":
|
|
272
|
+
if (adapter.getOwnerKey) {
|
|
273
|
+
key = await adapter.getOwnerKey(username);
|
|
274
|
+
} else {
|
|
275
|
+
throw new Error(
|
|
276
|
+
`Owner key not supported by adapter. Owner operations (like account recovery) require master password login or manual key entry.`
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
break;
|
|
280
|
+
case "active":
|
|
281
|
+
if (adapter.getActiveKey) {
|
|
282
|
+
key = await adapter.getActiveKey(username);
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
case "memo":
|
|
286
|
+
if (adapter.getMemoKey) {
|
|
287
|
+
key = await adapter.getMemoKey(username);
|
|
288
|
+
} else {
|
|
289
|
+
throw new Error(
|
|
290
|
+
`Memo key not supported by adapter. Use memo encryption methods instead.`
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
break;
|
|
294
|
+
case "posting":
|
|
295
|
+
default:
|
|
296
|
+
key = await adapter.getPostingKey(username);
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (!key) {
|
|
301
|
+
throw new Error(`No ${authority} key available for ${username}`);
|
|
302
|
+
}
|
|
303
|
+
const privateKey = dhive.PrivateKey.fromString(key);
|
|
304
|
+
return await CONFIG.hiveClient.broadcast.sendOperations(ops2, privateKey);
|
|
305
|
+
}
|
|
306
|
+
case "hiveauth": {
|
|
307
|
+
if (!adapter?.broadcastWithHiveAuth) {
|
|
308
|
+
throw new Error("HiveAuth not supported by adapter");
|
|
309
|
+
}
|
|
310
|
+
return await adapter.broadcastWithHiveAuth(username, ops2, authority);
|
|
311
|
+
}
|
|
312
|
+
case "hivesigner": {
|
|
313
|
+
if (!adapter) {
|
|
314
|
+
throw new Error("No adapter provided for HiveSigner auth");
|
|
315
|
+
}
|
|
316
|
+
const token = fetchedToken !== void 0 ? fetchedToken : await adapter.getAccessToken(username);
|
|
317
|
+
if (!token) {
|
|
318
|
+
throw new Error(`No access token available for ${username}`);
|
|
319
|
+
}
|
|
320
|
+
const client = new hs__default.default.Client({ accessToken: token });
|
|
321
|
+
const response = await client.broadcast(ops2);
|
|
322
|
+
return response.result;
|
|
323
|
+
}
|
|
324
|
+
case "keychain": {
|
|
325
|
+
if (!adapter?.broadcastWithKeychain) {
|
|
326
|
+
throw new Error("Keychain not supported by adapter");
|
|
327
|
+
}
|
|
328
|
+
return await adapter.broadcastWithKeychain(username, ops2, authority);
|
|
329
|
+
}
|
|
330
|
+
case "custom": {
|
|
331
|
+
if (!auth?.broadcast) {
|
|
332
|
+
throw new Error("No custom broadcast function provided");
|
|
333
|
+
}
|
|
334
|
+
return await auth.broadcast(ops2, authority);
|
|
335
|
+
}
|
|
336
|
+
default:
|
|
337
|
+
throw new Error(`Unknown auth method: ${method}`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
261
340
|
async function broadcastWithFallback(username, ops2, auth, authority = "posting") {
|
|
341
|
+
const adapter = auth?.adapter;
|
|
342
|
+
if (adapter?.getLoginType) {
|
|
343
|
+
const loginType = await adapter.getLoginType(username);
|
|
344
|
+
if (loginType) {
|
|
345
|
+
const hasPostingAuth = adapter.hasPostingAuthorization ? await adapter.hasPostingAuthorization(username) : false;
|
|
346
|
+
if (authority === "posting" && hasPostingAuth && loginType === "key") {
|
|
347
|
+
try {
|
|
348
|
+
return await broadcastWithMethod("hivesigner", username, ops2, auth, authority);
|
|
349
|
+
} catch (error) {
|
|
350
|
+
if (!shouldTriggerAuthFallback(error)) {
|
|
351
|
+
throw error;
|
|
352
|
+
}
|
|
353
|
+
console.warn("[SDK] HiveSigner token auth failed, falling back to key:", error);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
if (authority === "posting" && hasPostingAuth && loginType === "hiveauth") {
|
|
357
|
+
try {
|
|
358
|
+
return await broadcastWithMethod("hivesigner", username, ops2, auth, authority);
|
|
359
|
+
} catch (error) {
|
|
360
|
+
if (!shouldTriggerAuthFallback(error)) {
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
console.warn("[SDK] HiveSigner token auth failed, falling back to HiveAuth:", error);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
try {
|
|
367
|
+
return await broadcastWithMethod(loginType, username, ops2, auth, authority);
|
|
368
|
+
} catch (error) {
|
|
369
|
+
if (shouldTriggerAuthFallback(error)) {
|
|
370
|
+
if (adapter.showAuthUpgradeUI && (authority === "posting" || authority === "active")) {
|
|
371
|
+
const operationName = ops2.length > 0 ? ops2[0][0] : "unknown";
|
|
372
|
+
const selectedMethod = await adapter.showAuthUpgradeUI(authority, operationName);
|
|
373
|
+
if (!selectedMethod) {
|
|
374
|
+
throw new Error(`Operation requires ${authority} authority. User declined alternate auth.`);
|
|
375
|
+
}
|
|
376
|
+
return await broadcastWithMethod(selectedMethod, username, ops2, auth, authority);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
throw error;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
262
383
|
const chain = auth?.fallbackChain ?? ["key", "hiveauth", "hivesigner", "keychain", "custom"];
|
|
263
384
|
const errors = /* @__PURE__ */ new Map();
|
|
264
|
-
const adapter = auth?.adapter;
|
|
265
385
|
for (const method of chain) {
|
|
266
386
|
try {
|
|
387
|
+
let shouldSkip = false;
|
|
388
|
+
let skipReason = "";
|
|
389
|
+
let prefetchedKey;
|
|
390
|
+
let prefetchedToken;
|
|
267
391
|
switch (method) {
|
|
268
|
-
case "key":
|
|
392
|
+
case "key":
|
|
269
393
|
if (!adapter) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
394
|
+
shouldSkip = true;
|
|
395
|
+
skipReason = "No adapter provided";
|
|
396
|
+
} else {
|
|
397
|
+
let key;
|
|
398
|
+
switch (authority) {
|
|
399
|
+
case "owner":
|
|
400
|
+
if (adapter.getOwnerKey) {
|
|
401
|
+
key = await adapter.getOwnerKey(username);
|
|
402
|
+
}
|
|
403
|
+
break;
|
|
404
|
+
case "active":
|
|
405
|
+
if (adapter.getActiveKey) {
|
|
406
|
+
key = await adapter.getActiveKey(username);
|
|
407
|
+
}
|
|
408
|
+
break;
|
|
409
|
+
case "memo":
|
|
410
|
+
if (adapter.getMemoKey) {
|
|
411
|
+
key = await adapter.getMemoKey(username);
|
|
412
|
+
}
|
|
413
|
+
break;
|
|
414
|
+
case "posting":
|
|
415
|
+
default:
|
|
416
|
+
key = await adapter.getPostingKey(username);
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
if (!key) {
|
|
420
|
+
shouldSkip = true;
|
|
421
|
+
skipReason = `No ${authority} key available`;
|
|
422
|
+
} else {
|
|
423
|
+
prefetchedKey = key;
|
|
424
|
+
}
|
|
282
425
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
}
|
|
286
|
-
case "hiveauth": {
|
|
426
|
+
break;
|
|
427
|
+
case "hiveauth":
|
|
287
428
|
if (!adapter?.broadcastWithHiveAuth) {
|
|
288
|
-
|
|
289
|
-
|
|
429
|
+
shouldSkip = true;
|
|
430
|
+
skipReason = "HiveAuth not supported by adapter";
|
|
290
431
|
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
case "hivesigner": {
|
|
432
|
+
break;
|
|
433
|
+
case "hivesigner":
|
|
294
434
|
if (!adapter) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
435
|
+
shouldSkip = true;
|
|
436
|
+
skipReason = "No adapter provided";
|
|
437
|
+
} else {
|
|
438
|
+
const token = await adapter.getAccessToken(username);
|
|
439
|
+
if (!token) {
|
|
440
|
+
shouldSkip = true;
|
|
441
|
+
skipReason = "No access token available";
|
|
442
|
+
} else {
|
|
443
|
+
prefetchedToken = token;
|
|
444
|
+
}
|
|
302
445
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
return response.result;
|
|
306
|
-
}
|
|
307
|
-
case "keychain": {
|
|
446
|
+
break;
|
|
447
|
+
case "keychain":
|
|
308
448
|
if (!adapter?.broadcastWithKeychain) {
|
|
309
|
-
|
|
310
|
-
|
|
449
|
+
shouldSkip = true;
|
|
450
|
+
skipReason = "Keychain not supported by adapter";
|
|
311
451
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
case "custom": {
|
|
452
|
+
break;
|
|
453
|
+
case "custom":
|
|
315
454
|
if (!auth?.broadcast) {
|
|
316
|
-
|
|
317
|
-
|
|
455
|
+
shouldSkip = true;
|
|
456
|
+
skipReason = "No custom broadcast function provided";
|
|
318
457
|
}
|
|
319
|
-
|
|
320
|
-
}
|
|
458
|
+
break;
|
|
321
459
|
}
|
|
460
|
+
if (shouldSkip) {
|
|
461
|
+
errors.set(method, new Error(`Skipped: ${skipReason}`));
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
return await broadcastWithMethod(method, username, ops2, auth, authority, prefetchedKey, prefetchedToken);
|
|
322
465
|
} catch (error) {
|
|
323
466
|
errors.set(method, error);
|
|
324
467
|
if (!shouldTriggerAuthFallback(error)) {
|
|
@@ -360,6 +503,11 @@ function useBroadcastMutation(mutationKey = [], username, operations, onSuccess
|
|
|
360
503
|
}
|
|
361
504
|
const postingKey = auth?.postingKey;
|
|
362
505
|
if (postingKey) {
|
|
506
|
+
if (authority !== "posting") {
|
|
507
|
+
throw new Error(
|
|
508
|
+
`[SDK][Broadcast] Legacy auth only supports posting authority, but '${authority}' was requested. Use AuthContextV2 with an adapter for ${authority} operations.`
|
|
509
|
+
);
|
|
510
|
+
}
|
|
363
511
|
const privateKey = dhive.PrivateKey.fromString(postingKey);
|
|
364
512
|
return CONFIG.hiveClient.broadcast.sendOperations(
|
|
365
513
|
ops2,
|
|
@@ -3130,1542 +3278,1670 @@ function useAccountRelationsUpdate(reference, target, auth, onSuccess, onError)
|
|
|
3130
3278
|
}
|
|
3131
3279
|
});
|
|
3132
3280
|
}
|
|
3133
|
-
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
|
|
3140
|
-
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
|
|
3146
|
-
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
code
|
|
3152
|
-
})
|
|
3153
|
-
}
|
|
3154
|
-
);
|
|
3155
|
-
return response.json();
|
|
3156
|
-
},
|
|
3157
|
-
onSuccess: () => {
|
|
3158
|
-
onSuccess();
|
|
3159
|
-
getQueryClient().invalidateQueries({
|
|
3160
|
-
queryKey: ["accounts", "bookmarks", username]
|
|
3161
|
-
});
|
|
3162
|
-
},
|
|
3163
|
-
onError
|
|
3164
|
-
});
|
|
3165
|
-
}
|
|
3166
|
-
function useBookmarkDelete(username, code, onSuccess, onError) {
|
|
3167
|
-
return reactQuery.useMutation({
|
|
3168
|
-
mutationKey: ["accounts", "bookmarks", "delete", username],
|
|
3169
|
-
mutationFn: async (bookmarkId) => {
|
|
3170
|
-
if (!username || !code) {
|
|
3171
|
-
throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");
|
|
3172
|
-
}
|
|
3173
|
-
const fetchApi = getBoundFetch();
|
|
3174
|
-
const response = await fetchApi(
|
|
3175
|
-
CONFIG.privateApiHost + "/private-api/bookmarks-delete",
|
|
3176
|
-
{
|
|
3177
|
-
method: "POST",
|
|
3178
|
-
headers: {
|
|
3179
|
-
"Content-Type": "application/json"
|
|
3180
|
-
},
|
|
3181
|
-
body: JSON.stringify({
|
|
3182
|
-
id: bookmarkId,
|
|
3183
|
-
code
|
|
3184
|
-
})
|
|
3185
|
-
}
|
|
3186
|
-
);
|
|
3187
|
-
return response.json();
|
|
3188
|
-
},
|
|
3189
|
-
onSuccess: () => {
|
|
3190
|
-
onSuccess();
|
|
3191
|
-
getQueryClient().invalidateQueries({
|
|
3192
|
-
queryKey: ["accounts", "bookmarks", username]
|
|
3193
|
-
});
|
|
3194
|
-
},
|
|
3195
|
-
onError
|
|
3196
|
-
});
|
|
3281
|
+
|
|
3282
|
+
// src/modules/operations/builders/content.ts
|
|
3283
|
+
function buildVoteOp(voter, author, permlink, weight) {
|
|
3284
|
+
if (!voter || !author || !permlink) {
|
|
3285
|
+
throw new Error("[SDK][buildVoteOp] Missing required parameters");
|
|
3286
|
+
}
|
|
3287
|
+
if (weight < -1e4 || weight > 1e4) {
|
|
3288
|
+
throw new Error("[SDK][buildVoteOp] Weight must be between -10000 and 10000");
|
|
3289
|
+
}
|
|
3290
|
+
return [
|
|
3291
|
+
"vote",
|
|
3292
|
+
{
|
|
3293
|
+
voter,
|
|
3294
|
+
author,
|
|
3295
|
+
permlink,
|
|
3296
|
+
weight
|
|
3297
|
+
}
|
|
3298
|
+
];
|
|
3197
3299
|
}
|
|
3198
|
-
function
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
|
|
3211
|
-
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
account,
|
|
3215
|
-
code
|
|
3216
|
-
})
|
|
3217
|
-
}
|
|
3218
|
-
);
|
|
3219
|
-
return response.json();
|
|
3220
|
-
},
|
|
3221
|
-
onSuccess: () => {
|
|
3222
|
-
onSuccess();
|
|
3223
|
-
getQueryClient().invalidateQueries({
|
|
3224
|
-
queryKey: ["accounts", "favourites", username]
|
|
3225
|
-
});
|
|
3226
|
-
},
|
|
3227
|
-
onError
|
|
3228
|
-
});
|
|
3300
|
+
function buildCommentOp(author, permlink, parentAuthor, parentPermlink, title, body, jsonMetadata) {
|
|
3301
|
+
if (!author || !permlink || parentPermlink === void 0 || !body) {
|
|
3302
|
+
throw new Error("[SDK][buildCommentOp] Missing required parameters");
|
|
3303
|
+
}
|
|
3304
|
+
return [
|
|
3305
|
+
"comment",
|
|
3306
|
+
{
|
|
3307
|
+
parent_author: parentAuthor,
|
|
3308
|
+
parent_permlink: parentPermlink,
|
|
3309
|
+
author,
|
|
3310
|
+
permlink,
|
|
3311
|
+
title,
|
|
3312
|
+
body,
|
|
3313
|
+
json_metadata: JSON.stringify(jsonMetadata)
|
|
3314
|
+
}
|
|
3315
|
+
];
|
|
3229
3316
|
}
|
|
3230
|
-
function
|
|
3231
|
-
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
account,
|
|
3247
|
-
code
|
|
3248
|
-
})
|
|
3249
|
-
}
|
|
3250
|
-
);
|
|
3251
|
-
return response.json();
|
|
3252
|
-
},
|
|
3253
|
-
onSuccess: () => {
|
|
3254
|
-
onSuccess();
|
|
3255
|
-
getQueryClient().invalidateQueries({
|
|
3256
|
-
queryKey: ["accounts", "favourites", username]
|
|
3257
|
-
});
|
|
3258
|
-
},
|
|
3259
|
-
onError
|
|
3260
|
-
});
|
|
3317
|
+
function buildCommentOptionsOp(author, permlink, maxAcceptedPayout, percentHbd, allowVotes, allowCurationRewards, extensions) {
|
|
3318
|
+
if (!author || !permlink) {
|
|
3319
|
+
throw new Error("[SDK][buildCommentOptionsOp] Missing required parameters");
|
|
3320
|
+
}
|
|
3321
|
+
return [
|
|
3322
|
+
"comment_options",
|
|
3323
|
+
{
|
|
3324
|
+
author,
|
|
3325
|
+
permlink,
|
|
3326
|
+
max_accepted_payout: maxAcceptedPayout,
|
|
3327
|
+
percent_hbd: percentHbd,
|
|
3328
|
+
allow_votes: allowVotes,
|
|
3329
|
+
allow_curation_rewards: allowCurationRewards,
|
|
3330
|
+
extensions
|
|
3331
|
+
}
|
|
3332
|
+
];
|
|
3261
3333
|
}
|
|
3262
|
-
function
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3271
|
-
}
|
|
3272
|
-
|
|
3273
|
-
|
|
3274
|
-
|
|
3275
|
-
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
}) => {
|
|
3283
|
-
if (keys.length === 0) {
|
|
3284
|
-
throw new Error(
|
|
3285
|
-
"[SDK][Update password] \u2013 no new keys provided"
|
|
3286
|
-
);
|
|
3287
|
-
}
|
|
3288
|
-
if (!accountData) {
|
|
3289
|
-
throw new Error(
|
|
3290
|
-
"[SDK][Update password] \u2013 cannot update keys for anon user"
|
|
3291
|
-
);
|
|
3292
|
-
}
|
|
3293
|
-
const prepareAuth = (keyName) => {
|
|
3294
|
-
const auth = R4__namespace.clone(accountData[keyName]);
|
|
3295
|
-
const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];
|
|
3296
|
-
const allKeysToRevoke = [
|
|
3297
|
-
...keysToRevokeForAuthority,
|
|
3298
|
-
...keysToRevokeByAuthority[keyName] === void 0 ? keysToRevoke : []
|
|
3299
|
-
];
|
|
3300
|
-
const existingKeys = keepCurrent ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString())) : [];
|
|
3301
|
-
auth.key_auths = dedupeAndSortKeyAuths(
|
|
3302
|
-
existingKeys,
|
|
3303
|
-
keys.map(
|
|
3304
|
-
(values, i) => [values[keyName].createPublic().toString(), i + 1]
|
|
3305
|
-
)
|
|
3306
|
-
);
|
|
3307
|
-
return auth;
|
|
3308
|
-
};
|
|
3309
|
-
return CONFIG.hiveClient.broadcast.updateAccount(
|
|
3310
|
-
{
|
|
3311
|
-
account: username,
|
|
3312
|
-
json_metadata: accountData.json_metadata,
|
|
3313
|
-
owner: prepareAuth("owner"),
|
|
3314
|
-
active: prepareAuth("active"),
|
|
3315
|
-
posting: prepareAuth("posting"),
|
|
3316
|
-
// Always use new memo key when adding new keys
|
|
3317
|
-
memo_key: keys[0].memo_key.createPublic().toString()
|
|
3318
|
-
},
|
|
3319
|
-
currentKey
|
|
3320
|
-
);
|
|
3321
|
-
},
|
|
3322
|
-
...options
|
|
3323
|
-
});
|
|
3324
|
-
}
|
|
3325
|
-
function useAccountUpdatePassword(username, options) {
|
|
3326
|
-
const { data: accountData } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
3327
|
-
const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);
|
|
3328
|
-
return reactQuery.useMutation({
|
|
3329
|
-
mutationKey: ["accounts", "password-update", username],
|
|
3330
|
-
mutationFn: async ({
|
|
3331
|
-
newPassword,
|
|
3332
|
-
currentPassword,
|
|
3333
|
-
keepCurrent
|
|
3334
|
-
}) => {
|
|
3335
|
-
if (!accountData) {
|
|
3336
|
-
throw new Error(
|
|
3337
|
-
"[SDK][Update password] \u2013 cannot update password for anon user"
|
|
3338
|
-
);
|
|
3339
|
-
}
|
|
3340
|
-
const currentKey = dhive.PrivateKey.fromLogin(
|
|
3341
|
-
username,
|
|
3342
|
-
currentPassword,
|
|
3343
|
-
"owner"
|
|
3344
|
-
);
|
|
3345
|
-
return updateKeys({
|
|
3346
|
-
currentKey,
|
|
3347
|
-
keepCurrent,
|
|
3348
|
-
keys: [
|
|
3349
|
-
{
|
|
3350
|
-
owner: dhive.PrivateKey.fromLogin(username, newPassword, "owner"),
|
|
3351
|
-
active: dhive.PrivateKey.fromLogin(username, newPassword, "active"),
|
|
3352
|
-
posting: dhive.PrivateKey.fromLogin(username, newPassword, "posting"),
|
|
3353
|
-
memo_key: dhive.PrivateKey.fromLogin(username, newPassword, "memo")
|
|
3354
|
-
}
|
|
3355
|
-
]
|
|
3356
|
-
});
|
|
3357
|
-
},
|
|
3358
|
-
...options
|
|
3359
|
-
});
|
|
3360
|
-
}
|
|
3361
|
-
function useAccountRevokePosting(username, options, auth) {
|
|
3362
|
-
const queryClient = reactQuery.useQueryClient();
|
|
3363
|
-
const { data } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
3364
|
-
return reactQuery.useMutation({
|
|
3365
|
-
mutationKey: ["accounts", "revoke-posting", data?.name],
|
|
3366
|
-
mutationFn: async ({ accountName, type, key }) => {
|
|
3367
|
-
if (!data) {
|
|
3368
|
-
throw new Error(
|
|
3369
|
-
"[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user"
|
|
3370
|
-
);
|
|
3371
|
-
}
|
|
3372
|
-
const posting = R4__namespace.pipe(
|
|
3373
|
-
{},
|
|
3374
|
-
R4__namespace.mergeDeep(data.posting)
|
|
3375
|
-
);
|
|
3376
|
-
posting.account_auths = posting.account_auths.filter(
|
|
3377
|
-
([account]) => account !== accountName
|
|
3378
|
-
);
|
|
3379
|
-
const operationBody = {
|
|
3380
|
-
account: data.name,
|
|
3381
|
-
posting,
|
|
3382
|
-
memo_key: data.memo_key,
|
|
3383
|
-
json_metadata: data.json_metadata
|
|
3384
|
-
};
|
|
3385
|
-
if (type === "key" && key) {
|
|
3386
|
-
return CONFIG.hiveClient.broadcast.updateAccount(operationBody, key);
|
|
3387
|
-
} else if (type === "keychain") {
|
|
3388
|
-
if (!auth?.broadcast) {
|
|
3389
|
-
throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");
|
|
3390
|
-
}
|
|
3391
|
-
return auth.broadcast([["account_update", operationBody]], "active");
|
|
3392
|
-
} else {
|
|
3393
|
-
const params = {
|
|
3394
|
-
callback: `https://ecency.com/@${data.name}/permissions`
|
|
3395
|
-
};
|
|
3396
|
-
return hs__default.default.sendOperation(
|
|
3397
|
-
["account_update", operationBody],
|
|
3398
|
-
params,
|
|
3399
|
-
() => {
|
|
3400
|
-
}
|
|
3401
|
-
);
|
|
3402
|
-
}
|
|
3403
|
-
},
|
|
3404
|
-
onError: options.onError,
|
|
3405
|
-
onSuccess: (resp, payload, ctx) => {
|
|
3406
|
-
options.onSuccess?.(resp, payload, ctx);
|
|
3407
|
-
queryClient.setQueryData(
|
|
3408
|
-
getAccountFullQueryOptions(username).queryKey,
|
|
3409
|
-
(data2) => ({
|
|
3410
|
-
...data2,
|
|
3411
|
-
posting: {
|
|
3412
|
-
...data2?.posting,
|
|
3413
|
-
account_auths: data2?.posting?.account_auths?.filter(
|
|
3414
|
-
([account]) => account !== payload.accountName
|
|
3415
|
-
) ?? []
|
|
3416
|
-
}
|
|
3417
|
-
})
|
|
3418
|
-
);
|
|
3419
|
-
}
|
|
3420
|
-
});
|
|
3421
|
-
}
|
|
3422
|
-
function useAccountUpdateRecovery(username, code, options, auth) {
|
|
3423
|
-
const { data } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
3424
|
-
return reactQuery.useMutation({
|
|
3425
|
-
mutationKey: ["accounts", "recovery", data?.name],
|
|
3426
|
-
mutationFn: async ({ accountName, type, key, email }) => {
|
|
3427
|
-
if (!data) {
|
|
3428
|
-
throw new Error(
|
|
3429
|
-
"[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user"
|
|
3430
|
-
);
|
|
3431
|
-
}
|
|
3432
|
-
const operationBody = {
|
|
3433
|
-
account_to_recover: data.name,
|
|
3434
|
-
new_recovery_account: accountName,
|
|
3435
|
-
extensions: []
|
|
3436
|
-
};
|
|
3437
|
-
if (type === "ecency") {
|
|
3438
|
-
if (!code) {
|
|
3439
|
-
throw new Error("[SDK][Accounts] \u2013 missing access token");
|
|
3440
|
-
}
|
|
3441
|
-
const fetchApi = getBoundFetch();
|
|
3442
|
-
return fetchApi(CONFIG.privateApiHost + "/private-api/recoveries-add", {
|
|
3443
|
-
method: "POST",
|
|
3444
|
-
body: JSON.stringify({
|
|
3445
|
-
code,
|
|
3446
|
-
email,
|
|
3447
|
-
publicKeys: [
|
|
3448
|
-
...data.owner.key_auths,
|
|
3449
|
-
...data.active.key_auths,
|
|
3450
|
-
...data.posting.key_auths,
|
|
3451
|
-
data.memo_key
|
|
3452
|
-
]
|
|
3453
|
-
})
|
|
3454
|
-
});
|
|
3455
|
-
} else if (type === "key" && key) {
|
|
3456
|
-
return CONFIG.hiveClient.broadcast.sendOperations(
|
|
3457
|
-
[["change_recovery_account", operationBody]],
|
|
3458
|
-
key
|
|
3459
|
-
);
|
|
3460
|
-
} else if (type === "keychain") {
|
|
3461
|
-
if (!auth?.broadcast) {
|
|
3462
|
-
throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");
|
|
3463
|
-
}
|
|
3464
|
-
return auth.broadcast([["change_recovery_account", operationBody]], "owner");
|
|
3465
|
-
} else {
|
|
3466
|
-
const params = {
|
|
3467
|
-
callback: `https://ecency.com/@${data.name}/permissions`
|
|
3468
|
-
};
|
|
3469
|
-
return hs__default.default.sendOperation(
|
|
3470
|
-
["change_recovery_account", operationBody],
|
|
3471
|
-
params,
|
|
3472
|
-
() => {
|
|
3473
|
-
}
|
|
3474
|
-
);
|
|
3475
|
-
}
|
|
3476
|
-
},
|
|
3477
|
-
onError: options.onError,
|
|
3478
|
-
onSuccess: options.onSuccess
|
|
3479
|
-
});
|
|
3480
|
-
}
|
|
3481
|
-
function useAccountRevokeKey(username, options) {
|
|
3482
|
-
const { data: accountData } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
3483
|
-
return reactQuery.useMutation({
|
|
3484
|
-
mutationKey: ["accounts", "revoke-key", accountData?.name],
|
|
3485
|
-
mutationFn: async ({ currentKey, revokingKey }) => {
|
|
3486
|
-
if (!accountData) {
|
|
3487
|
-
throw new Error(
|
|
3488
|
-
"[SDK][Update password] \u2013 cannot update keys for anon user"
|
|
3489
|
-
);
|
|
3490
|
-
}
|
|
3491
|
-
const prepareAuth = (keyName) => {
|
|
3492
|
-
const auth = R4__namespace.clone(accountData[keyName]);
|
|
3493
|
-
auth.key_auths = auth.key_auths.filter(
|
|
3494
|
-
([key]) => key !== revokingKey.toString()
|
|
3495
|
-
);
|
|
3496
|
-
return auth;
|
|
3497
|
-
};
|
|
3498
|
-
return CONFIG.hiveClient.broadcast.updateAccount(
|
|
3499
|
-
{
|
|
3500
|
-
account: accountData.name,
|
|
3501
|
-
json_metadata: accountData.json_metadata,
|
|
3502
|
-
owner: prepareAuth("owner"),
|
|
3503
|
-
active: prepareAuth("active"),
|
|
3504
|
-
posting: prepareAuth("posting"),
|
|
3505
|
-
memo_key: accountData.memo_key
|
|
3506
|
-
},
|
|
3507
|
-
currentKey
|
|
3508
|
-
);
|
|
3509
|
-
},
|
|
3510
|
-
...options
|
|
3511
|
-
});
|
|
3512
|
-
}
|
|
3513
|
-
|
|
3514
|
-
// src/modules/accounts/utils/account-power.ts
|
|
3515
|
-
var HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24;
|
|
3516
|
-
function vestsToRshares(vests, votingPowerValue, votePerc) {
|
|
3517
|
-
const vestingShares = vests * 1e6;
|
|
3518
|
-
const power = votingPowerValue * votePerc / 1e4 / 50 + 1;
|
|
3519
|
-
return power * vestingShares / 1e4;
|
|
3520
|
-
}
|
|
3521
|
-
function toDhiveAccountForVotingMana(account) {
|
|
3522
|
-
return {
|
|
3523
|
-
id: 0,
|
|
3524
|
-
name: account.name,
|
|
3525
|
-
owner: account.owner,
|
|
3526
|
-
active: account.active,
|
|
3527
|
-
posting: account.posting,
|
|
3528
|
-
memo_key: account.memo_key,
|
|
3529
|
-
json_metadata: account.json_metadata,
|
|
3530
|
-
posting_json_metadata: account.posting_json_metadata,
|
|
3531
|
-
proxy: account.proxy ?? "",
|
|
3532
|
-
last_owner_update: "",
|
|
3533
|
-
last_account_update: "",
|
|
3534
|
-
created: account.created,
|
|
3535
|
-
mined: false,
|
|
3536
|
-
owner_challenged: false,
|
|
3537
|
-
active_challenged: false,
|
|
3538
|
-
last_owner_proved: "",
|
|
3539
|
-
last_active_proved: "",
|
|
3540
|
-
recovery_account: account.recovery_account ?? "",
|
|
3541
|
-
reset_account: "",
|
|
3542
|
-
last_account_recovery: "",
|
|
3543
|
-
comment_count: 0,
|
|
3544
|
-
lifetime_vote_count: 0,
|
|
3545
|
-
post_count: account.post_count,
|
|
3546
|
-
can_vote: true,
|
|
3547
|
-
voting_power: account.voting_power,
|
|
3548
|
-
last_vote_time: account.last_vote_time,
|
|
3549
|
-
voting_manabar: account.voting_manabar,
|
|
3550
|
-
balance: account.balance,
|
|
3551
|
-
savings_balance: account.savings_balance,
|
|
3552
|
-
hbd_balance: account.hbd_balance,
|
|
3553
|
-
hbd_seconds: "0",
|
|
3554
|
-
hbd_seconds_last_update: "",
|
|
3555
|
-
hbd_last_interest_payment: "",
|
|
3556
|
-
savings_hbd_balance: account.savings_hbd_balance,
|
|
3557
|
-
savings_hbd_seconds: account.savings_hbd_seconds,
|
|
3558
|
-
savings_hbd_seconds_last_update: account.savings_hbd_seconds_last_update,
|
|
3559
|
-
savings_hbd_last_interest_payment: account.savings_hbd_last_interest_payment,
|
|
3560
|
-
savings_withdraw_requests: 0,
|
|
3561
|
-
reward_hbd_balance: account.reward_hbd_balance,
|
|
3562
|
-
reward_hive_balance: account.reward_hive_balance,
|
|
3563
|
-
reward_vesting_balance: account.reward_vesting_balance,
|
|
3564
|
-
reward_vesting_hive: account.reward_vesting_hive,
|
|
3565
|
-
curation_rewards: 0,
|
|
3566
|
-
posting_rewards: 0,
|
|
3567
|
-
vesting_shares: account.vesting_shares,
|
|
3568
|
-
delegated_vesting_shares: account.delegated_vesting_shares,
|
|
3569
|
-
received_vesting_shares: account.received_vesting_shares,
|
|
3570
|
-
vesting_withdraw_rate: account.vesting_withdraw_rate,
|
|
3571
|
-
next_vesting_withdrawal: account.next_vesting_withdrawal,
|
|
3572
|
-
withdrawn: account.withdrawn,
|
|
3573
|
-
to_withdraw: account.to_withdraw,
|
|
3574
|
-
withdraw_routes: 0,
|
|
3575
|
-
proxied_vsf_votes: account.proxied_vsf_votes ?? [],
|
|
3576
|
-
witnesses_voted_for: 0,
|
|
3577
|
-
average_bandwidth: 0,
|
|
3578
|
-
lifetime_bandwidth: 0,
|
|
3579
|
-
last_bandwidth_update: "",
|
|
3580
|
-
average_market_bandwidth: 0,
|
|
3581
|
-
lifetime_market_bandwidth: 0,
|
|
3582
|
-
last_market_bandwidth_update: "",
|
|
3583
|
-
last_post: account.last_post,
|
|
3584
|
-
last_root_post: ""
|
|
3334
|
+
function buildDeleteCommentOp(author, permlink) {
|
|
3335
|
+
if (!author || !permlink) {
|
|
3336
|
+
throw new Error("[SDK][buildDeleteCommentOp] Missing required parameters");
|
|
3337
|
+
}
|
|
3338
|
+
return [
|
|
3339
|
+
"delete_comment",
|
|
3340
|
+
{
|
|
3341
|
+
author,
|
|
3342
|
+
permlink
|
|
3343
|
+
}
|
|
3344
|
+
];
|
|
3345
|
+
}
|
|
3346
|
+
function buildReblogOp(account, author, permlink, deleteReblog = false) {
|
|
3347
|
+
if (!account || !author || !permlink) {
|
|
3348
|
+
throw new Error("[SDK][buildReblogOp] Missing required parameters");
|
|
3349
|
+
}
|
|
3350
|
+
const json = {
|
|
3351
|
+
account,
|
|
3352
|
+
author,
|
|
3353
|
+
permlink
|
|
3585
3354
|
};
|
|
3355
|
+
if (deleteReblog) {
|
|
3356
|
+
json.delete = "delete";
|
|
3357
|
+
}
|
|
3358
|
+
return [
|
|
3359
|
+
"custom_json",
|
|
3360
|
+
{
|
|
3361
|
+
id: "follow",
|
|
3362
|
+
json: JSON.stringify(["reblog", json]),
|
|
3363
|
+
required_auths: [],
|
|
3364
|
+
required_posting_auths: [account]
|
|
3365
|
+
}
|
|
3366
|
+
];
|
|
3586
3367
|
}
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3368
|
+
|
|
3369
|
+
// src/modules/operations/builders/wallet.ts
|
|
3370
|
+
function buildTransferOp(from, to, amount, memo) {
|
|
3371
|
+
if (!from || !to || !amount) {
|
|
3372
|
+
throw new Error("[SDK][buildTransferOp] Missing required parameters");
|
|
3373
|
+
}
|
|
3374
|
+
return [
|
|
3375
|
+
"transfer",
|
|
3376
|
+
{
|
|
3377
|
+
from,
|
|
3378
|
+
to,
|
|
3379
|
+
amount,
|
|
3380
|
+
memo: memo || ""
|
|
3381
|
+
}
|
|
3382
|
+
];
|
|
3383
|
+
}
|
|
3384
|
+
function buildMultiTransferOps(from, destinations, amount, memo) {
|
|
3385
|
+
if (!from || !destinations || !amount) {
|
|
3386
|
+
throw new Error("[SDK][buildMultiTransferOps] Missing required parameters");
|
|
3387
|
+
}
|
|
3388
|
+
const destArray = destinations.trim().split(/[\s,]+/).filter(Boolean);
|
|
3389
|
+
return destArray.map(
|
|
3390
|
+
(dest) => buildTransferOp(from, dest.trim(), amount, memo)
|
|
3590
3391
|
);
|
|
3591
|
-
return calc.percentage / 100;
|
|
3592
3392
|
}
|
|
3593
|
-
function
|
|
3594
|
-
if (!
|
|
3595
|
-
throw new
|
|
3393
|
+
function buildRecurrentTransferOp(from, to, amount, memo, recurrence, executions) {
|
|
3394
|
+
if (!from || !to || !amount) {
|
|
3395
|
+
throw new Error("[SDK][buildRecurrentTransferOp] Missing required parameters");
|
|
3596
3396
|
}
|
|
3597
|
-
if (
|
|
3598
|
-
throw new
|
|
3397
|
+
if (recurrence < 24) {
|
|
3398
|
+
throw new Error("[SDK][buildRecurrentTransferOp] Recurrence must be at least 24 hours");
|
|
3599
3399
|
}
|
|
3600
|
-
|
|
3601
|
-
|
|
3400
|
+
return [
|
|
3401
|
+
"recurrent_transfer",
|
|
3402
|
+
{
|
|
3403
|
+
from,
|
|
3404
|
+
to,
|
|
3405
|
+
amount,
|
|
3406
|
+
memo: memo || "",
|
|
3407
|
+
recurrence,
|
|
3408
|
+
executions,
|
|
3409
|
+
extensions: []
|
|
3410
|
+
}
|
|
3411
|
+
];
|
|
3602
3412
|
}
|
|
3603
|
-
function
|
|
3604
|
-
|
|
3605
|
-
|
|
3606
|
-
const maxMana = totalShares * 1e6 / 4;
|
|
3607
|
-
if (maxMana <= 0) {
|
|
3608
|
-
return 0;
|
|
3609
|
-
}
|
|
3610
|
-
let currentMana = parseFloat(account.downvote_manabar.current_mana.toString()) + elapsed * maxMana / HIVE_VOTING_MANA_REGENERATION_SECONDS;
|
|
3611
|
-
if (currentMana > maxMana) {
|
|
3612
|
-
currentMana = maxMana;
|
|
3413
|
+
function buildTransferToSavingsOp(from, to, amount, memo) {
|
|
3414
|
+
if (!from || !to || !amount) {
|
|
3415
|
+
throw new Error("[SDK][buildTransferToSavingsOp] Missing required parameters");
|
|
3613
3416
|
}
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3417
|
+
return [
|
|
3418
|
+
"transfer_to_savings",
|
|
3419
|
+
{
|
|
3420
|
+
from,
|
|
3421
|
+
to,
|
|
3422
|
+
amount,
|
|
3423
|
+
memo: memo || ""
|
|
3424
|
+
}
|
|
3425
|
+
];
|
|
3426
|
+
}
|
|
3427
|
+
function buildTransferFromSavingsOp(from, to, amount, memo, requestId) {
|
|
3428
|
+
if (!from || !to || !amount || requestId === void 0) {
|
|
3429
|
+
throw new Error("[SDK][buildTransferFromSavingsOp] Missing required parameters");
|
|
3617
3430
|
}
|
|
3618
|
-
|
|
3619
|
-
|
|
3431
|
+
return [
|
|
3432
|
+
"transfer_from_savings",
|
|
3433
|
+
{
|
|
3434
|
+
from,
|
|
3435
|
+
to,
|
|
3436
|
+
amount,
|
|
3437
|
+
memo: memo || "",
|
|
3438
|
+
request_id: requestId
|
|
3439
|
+
}
|
|
3440
|
+
];
|
|
3441
|
+
}
|
|
3442
|
+
function buildCancelTransferFromSavingsOp(from, requestId) {
|
|
3443
|
+
if (!from || requestId === void 0) {
|
|
3444
|
+
throw new Error("[SDK][buildCancelTransferFromSavingsOp] Missing required parameters");
|
|
3620
3445
|
}
|
|
3621
|
-
return
|
|
3446
|
+
return [
|
|
3447
|
+
"cancel_transfer_from_savings",
|
|
3448
|
+
{
|
|
3449
|
+
from,
|
|
3450
|
+
request_id: requestId
|
|
3451
|
+
}
|
|
3452
|
+
];
|
|
3622
3453
|
}
|
|
3623
|
-
function
|
|
3624
|
-
|
|
3625
|
-
|
|
3454
|
+
function buildClaimInterestOps(from, to, amount, memo, requestId) {
|
|
3455
|
+
if (!from || !to || !amount || requestId === void 0) {
|
|
3456
|
+
throw new Error("[SDK][buildClaimInterestOps] Missing required parameters");
|
|
3457
|
+
}
|
|
3458
|
+
return [
|
|
3459
|
+
buildTransferFromSavingsOp(from, to, amount, memo, requestId),
|
|
3460
|
+
buildCancelTransferFromSavingsOp(from, requestId)
|
|
3461
|
+
];
|
|
3626
3462
|
}
|
|
3627
|
-
function
|
|
3628
|
-
if (!
|
|
3629
|
-
|
|
3463
|
+
function buildTransferToVestingOp(from, to, amount) {
|
|
3464
|
+
if (!from || !to || !amount) {
|
|
3465
|
+
throw new Error("[SDK][buildTransferToVestingOp] Missing required parameters");
|
|
3630
3466
|
}
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
|
|
3467
|
+
return [
|
|
3468
|
+
"transfer_to_vesting",
|
|
3469
|
+
{
|
|
3470
|
+
from,
|
|
3471
|
+
to,
|
|
3472
|
+
amount
|
|
3473
|
+
}
|
|
3474
|
+
];
|
|
3475
|
+
}
|
|
3476
|
+
function buildWithdrawVestingOp(account, vestingShares) {
|
|
3477
|
+
if (!account || !vestingShares) {
|
|
3478
|
+
throw new Error("[SDK][buildWithdrawVestingOp] Missing required parameters");
|
|
3634
3479
|
}
|
|
3635
|
-
|
|
3636
|
-
|
|
3480
|
+
return [
|
|
3481
|
+
"withdraw_vesting",
|
|
3482
|
+
{
|
|
3483
|
+
account,
|
|
3484
|
+
vesting_shares: vestingShares
|
|
3485
|
+
}
|
|
3486
|
+
];
|
|
3487
|
+
}
|
|
3488
|
+
function buildDelegateVestingSharesOp(delegator, delegatee, vestingShares) {
|
|
3489
|
+
if (!delegator || !delegatee || !vestingShares) {
|
|
3490
|
+
throw new Error("[SDK][buildDelegateVestingSharesOp] Missing required parameters");
|
|
3637
3491
|
}
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
return 0;
|
|
3492
|
+
return [
|
|
3493
|
+
"delegate_vesting_shares",
|
|
3494
|
+
{
|
|
3495
|
+
delegator,
|
|
3496
|
+
delegatee,
|
|
3497
|
+
vesting_shares: vestingShares
|
|
3645
3498
|
}
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3499
|
+
];
|
|
3500
|
+
}
|
|
3501
|
+
function buildSetWithdrawVestingRouteOp(fromAccount, toAccount, percent, autoVest) {
|
|
3502
|
+
if (!fromAccount || !toAccount || percent === void 0) {
|
|
3503
|
+
throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Missing required parameters");
|
|
3649
3504
|
}
|
|
3650
|
-
if (
|
|
3651
|
-
|
|
3505
|
+
if (percent < 0 || percent > 1e4) {
|
|
3506
|
+
throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");
|
|
3652
3507
|
}
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3508
|
+
return [
|
|
3509
|
+
"set_withdraw_vesting_route",
|
|
3510
|
+
{
|
|
3511
|
+
from_account: fromAccount,
|
|
3512
|
+
to_account: toAccount,
|
|
3513
|
+
percent,
|
|
3514
|
+
auto_vest: autoVest
|
|
3515
|
+
}
|
|
3516
|
+
];
|
|
3517
|
+
}
|
|
3518
|
+
function buildConvertOp(owner, amount, requestId) {
|
|
3519
|
+
if (!owner || !amount || requestId === void 0) {
|
|
3520
|
+
throw new Error("[SDK][buildConvertOp] Missing required parameters");
|
|
3656
3521
|
}
|
|
3657
|
-
return
|
|
3522
|
+
return [
|
|
3523
|
+
"convert",
|
|
3524
|
+
{
|
|
3525
|
+
owner,
|
|
3526
|
+
amount,
|
|
3527
|
+
requestid: requestId
|
|
3528
|
+
}
|
|
3529
|
+
];
|
|
3658
3530
|
}
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
if (!voter || !author || !permlink) {
|
|
3663
|
-
throw new Error("[SDK][buildVoteOp] Missing required parameters");
|
|
3531
|
+
function buildCollateralizedConvertOp(owner, amount, requestId) {
|
|
3532
|
+
if (!owner || !amount || requestId === void 0) {
|
|
3533
|
+
throw new Error("[SDK][buildCollateralizedConvertOp] Missing required parameters");
|
|
3664
3534
|
}
|
|
3665
|
-
|
|
3666
|
-
|
|
3535
|
+
return [
|
|
3536
|
+
"collateralized_convert",
|
|
3537
|
+
{
|
|
3538
|
+
owner,
|
|
3539
|
+
amount,
|
|
3540
|
+
requestid: requestId
|
|
3541
|
+
}
|
|
3542
|
+
];
|
|
3543
|
+
}
|
|
3544
|
+
function buildDelegateRcOp(from, delegatees, maxRc) {
|
|
3545
|
+
if (!from || !delegatees || maxRc === void 0) {
|
|
3546
|
+
throw new Error("[SDK][buildDelegateRcOp] Missing required parameters");
|
|
3667
3547
|
}
|
|
3548
|
+
const delegateeArray = delegatees.includes(",") ? delegatees.split(",").map((d) => d.trim()) : [delegatees];
|
|
3668
3549
|
return [
|
|
3669
|
-
"
|
|
3550
|
+
"custom_json",
|
|
3670
3551
|
{
|
|
3671
|
-
|
|
3672
|
-
|
|
3673
|
-
|
|
3674
|
-
|
|
3552
|
+
id: "rc",
|
|
3553
|
+
json: JSON.stringify([
|
|
3554
|
+
"delegate_rc",
|
|
3555
|
+
{
|
|
3556
|
+
from,
|
|
3557
|
+
delegatees: delegateeArray,
|
|
3558
|
+
max_rc: maxRc
|
|
3559
|
+
}
|
|
3560
|
+
]),
|
|
3561
|
+
required_auths: [],
|
|
3562
|
+
required_posting_auths: [from]
|
|
3675
3563
|
}
|
|
3676
3564
|
];
|
|
3677
3565
|
}
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3566
|
+
|
|
3567
|
+
// src/modules/operations/builders/social.ts
|
|
3568
|
+
function buildFollowOp(follower, following) {
|
|
3569
|
+
if (!follower || !following) {
|
|
3570
|
+
throw new Error("[SDK][buildFollowOp] Missing required parameters");
|
|
3681
3571
|
}
|
|
3682
3572
|
return [
|
|
3683
|
-
"
|
|
3573
|
+
"custom_json",
|
|
3684
3574
|
{
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
3688
|
-
|
|
3689
|
-
|
|
3690
|
-
|
|
3691
|
-
|
|
3575
|
+
id: "follow",
|
|
3576
|
+
json: JSON.stringify([
|
|
3577
|
+
"follow",
|
|
3578
|
+
{
|
|
3579
|
+
follower,
|
|
3580
|
+
following,
|
|
3581
|
+
what: ["blog"]
|
|
3582
|
+
}
|
|
3583
|
+
]),
|
|
3584
|
+
required_auths: [],
|
|
3585
|
+
required_posting_auths: [follower]
|
|
3692
3586
|
}
|
|
3693
3587
|
];
|
|
3694
3588
|
}
|
|
3695
|
-
function
|
|
3696
|
-
if (!
|
|
3697
|
-
throw new Error("[SDK][
|
|
3589
|
+
function buildUnfollowOp(follower, following) {
|
|
3590
|
+
if (!follower || !following) {
|
|
3591
|
+
throw new Error("[SDK][buildUnfollowOp] Missing required parameters");
|
|
3698
3592
|
}
|
|
3699
3593
|
return [
|
|
3700
|
-
"
|
|
3594
|
+
"custom_json",
|
|
3701
3595
|
{
|
|
3702
|
-
|
|
3703
|
-
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3596
|
+
id: "follow",
|
|
3597
|
+
json: JSON.stringify([
|
|
3598
|
+
"follow",
|
|
3599
|
+
{
|
|
3600
|
+
follower,
|
|
3601
|
+
following,
|
|
3602
|
+
what: []
|
|
3603
|
+
}
|
|
3604
|
+
]),
|
|
3605
|
+
required_auths: [],
|
|
3606
|
+
required_posting_auths: [follower]
|
|
3709
3607
|
}
|
|
3710
3608
|
];
|
|
3711
3609
|
}
|
|
3712
|
-
function
|
|
3713
|
-
if (!
|
|
3714
|
-
throw new Error("[SDK][
|
|
3610
|
+
function buildIgnoreOp(follower, following) {
|
|
3611
|
+
if (!follower || !following) {
|
|
3612
|
+
throw new Error("[SDK][buildIgnoreOp] Missing required parameters");
|
|
3715
3613
|
}
|
|
3716
3614
|
return [
|
|
3717
|
-
"
|
|
3615
|
+
"custom_json",
|
|
3718
3616
|
{
|
|
3719
|
-
|
|
3720
|
-
|
|
3617
|
+
id: "follow",
|
|
3618
|
+
json: JSON.stringify([
|
|
3619
|
+
"follow",
|
|
3620
|
+
{
|
|
3621
|
+
follower,
|
|
3622
|
+
following,
|
|
3623
|
+
what: ["ignore"]
|
|
3624
|
+
}
|
|
3625
|
+
]),
|
|
3626
|
+
required_auths: [],
|
|
3627
|
+
required_posting_auths: [follower]
|
|
3721
3628
|
}
|
|
3722
3629
|
];
|
|
3723
3630
|
}
|
|
3724
|
-
function
|
|
3725
|
-
if (!
|
|
3726
|
-
throw new Error("[SDK][
|
|
3631
|
+
function buildUnignoreOp(follower, following) {
|
|
3632
|
+
if (!follower || !following) {
|
|
3633
|
+
throw new Error("[SDK][buildUnignoreOp] Missing required parameters");
|
|
3727
3634
|
}
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3733
|
-
if (deleteReblog) {
|
|
3734
|
-
json.delete = "delete";
|
|
3635
|
+
return buildUnfollowOp(follower, following);
|
|
3636
|
+
}
|
|
3637
|
+
function buildSetLastReadOps(username, date) {
|
|
3638
|
+
if (!username) {
|
|
3639
|
+
throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");
|
|
3735
3640
|
}
|
|
3736
|
-
|
|
3641
|
+
const lastReadDate = date || (/* @__PURE__ */ new Date()).toISOString().split(".")[0];
|
|
3642
|
+
const notifyOp = [
|
|
3737
3643
|
"custom_json",
|
|
3738
3644
|
{
|
|
3739
|
-
id: "
|
|
3740
|
-
json: JSON.stringify(["
|
|
3645
|
+
id: "notify",
|
|
3646
|
+
json: JSON.stringify(["setLastRead", { date: lastReadDate }]),
|
|
3741
3647
|
required_auths: [],
|
|
3742
|
-
required_posting_auths: [
|
|
3648
|
+
required_posting_auths: [username]
|
|
3743
3649
|
}
|
|
3744
3650
|
];
|
|
3651
|
+
const ecencyNotifyOp = [
|
|
3652
|
+
"custom_json",
|
|
3653
|
+
{
|
|
3654
|
+
id: "ecency_notify",
|
|
3655
|
+
json: JSON.stringify(["setLastRead", { date: lastReadDate }]),
|
|
3656
|
+
required_auths: [],
|
|
3657
|
+
required_posting_auths: [username]
|
|
3658
|
+
}
|
|
3659
|
+
];
|
|
3660
|
+
return [notifyOp, ecencyNotifyOp];
|
|
3745
3661
|
}
|
|
3746
3662
|
|
|
3747
|
-
// src/modules/operations/builders/
|
|
3748
|
-
function
|
|
3749
|
-
if (!
|
|
3750
|
-
throw new Error("[SDK][
|
|
3663
|
+
// src/modules/operations/builders/governance.ts
|
|
3664
|
+
function buildWitnessVoteOp(account, witness, approve) {
|
|
3665
|
+
if (!account || !witness || approve === void 0) {
|
|
3666
|
+
throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");
|
|
3751
3667
|
}
|
|
3752
3668
|
return [
|
|
3753
|
-
"
|
|
3669
|
+
"account_witness_vote",
|
|
3754
3670
|
{
|
|
3755
|
-
|
|
3756
|
-
|
|
3757
|
-
|
|
3758
|
-
memo: memo || ""
|
|
3671
|
+
account,
|
|
3672
|
+
witness,
|
|
3673
|
+
approve
|
|
3759
3674
|
}
|
|
3760
3675
|
];
|
|
3761
3676
|
}
|
|
3762
|
-
function
|
|
3763
|
-
if (!
|
|
3764
|
-
throw new Error("[SDK][
|
|
3677
|
+
function buildWitnessProxyOp(account, proxy) {
|
|
3678
|
+
if (!account || proxy === void 0) {
|
|
3679
|
+
throw new Error("[SDK][buildWitnessProxyOp] Missing required parameters");
|
|
3765
3680
|
}
|
|
3766
|
-
|
|
3767
|
-
|
|
3768
|
-
|
|
3769
|
-
|
|
3681
|
+
return [
|
|
3682
|
+
"account_witness_proxy",
|
|
3683
|
+
{
|
|
3684
|
+
account,
|
|
3685
|
+
proxy
|
|
3686
|
+
}
|
|
3687
|
+
];
|
|
3770
3688
|
}
|
|
3771
|
-
function
|
|
3772
|
-
if (!
|
|
3773
|
-
throw new Error("[SDK][
|
|
3689
|
+
function buildProposalCreateOp(creator, payload) {
|
|
3690
|
+
if (!creator || !payload.receiver || !payload.subject || !payload.permlink || !payload.start || !payload.end || !payload.dailyPay) {
|
|
3691
|
+
throw new Error("[SDK][buildProposalCreateOp] Missing required parameters");
|
|
3774
3692
|
}
|
|
3775
|
-
|
|
3776
|
-
|
|
3693
|
+
const startDate = new Date(payload.start);
|
|
3694
|
+
const endDate = new Date(payload.end);
|
|
3695
|
+
if (startDate.toString() === "Invalid Date" || endDate.toString() === "Invalid Date") {
|
|
3696
|
+
throw new Error(
|
|
3697
|
+
"[SDK][buildProposalCreateOp] Invalid date format: start and end must be valid ISO date strings"
|
|
3698
|
+
);
|
|
3777
3699
|
}
|
|
3778
3700
|
return [
|
|
3779
|
-
"
|
|
3701
|
+
"create_proposal",
|
|
3780
3702
|
{
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
3703
|
+
creator,
|
|
3704
|
+
receiver: payload.receiver,
|
|
3705
|
+
start_date: payload.start,
|
|
3706
|
+
end_date: payload.end,
|
|
3707
|
+
daily_pay: payload.dailyPay,
|
|
3708
|
+
subject: payload.subject,
|
|
3709
|
+
permlink: payload.permlink,
|
|
3787
3710
|
extensions: []
|
|
3788
3711
|
}
|
|
3789
3712
|
];
|
|
3790
3713
|
}
|
|
3791
|
-
function
|
|
3792
|
-
if (!
|
|
3793
|
-
throw new Error("[SDK][
|
|
3714
|
+
function buildProposalVoteOp(voter, proposalIds, approve) {
|
|
3715
|
+
if (!voter || !proposalIds || proposalIds.length === 0 || approve === void 0) {
|
|
3716
|
+
throw new Error("[SDK][buildProposalVoteOp] Missing required parameters");
|
|
3794
3717
|
}
|
|
3795
3718
|
return [
|
|
3796
|
-
"
|
|
3719
|
+
"update_proposal_votes",
|
|
3797
3720
|
{
|
|
3798
|
-
|
|
3799
|
-
|
|
3800
|
-
|
|
3801
|
-
|
|
3721
|
+
voter,
|
|
3722
|
+
proposal_ids: proposalIds,
|
|
3723
|
+
approve,
|
|
3724
|
+
extensions: []
|
|
3802
3725
|
}
|
|
3803
3726
|
];
|
|
3804
3727
|
}
|
|
3805
|
-
function
|
|
3806
|
-
if (!
|
|
3807
|
-
throw new Error("[SDK][
|
|
3728
|
+
function buildRemoveProposalOp(proposalOwner, proposalIds) {
|
|
3729
|
+
if (!proposalOwner || !proposalIds || proposalIds.length === 0) {
|
|
3730
|
+
throw new Error("[SDK][buildRemoveProposalOp] Missing required parameters");
|
|
3808
3731
|
}
|
|
3809
3732
|
return [
|
|
3810
|
-
"
|
|
3733
|
+
"remove_proposal",
|
|
3734
|
+
{
|
|
3735
|
+
proposal_owner: proposalOwner,
|
|
3736
|
+
proposal_ids: proposalIds,
|
|
3737
|
+
extensions: []
|
|
3738
|
+
}
|
|
3739
|
+
];
|
|
3740
|
+
}
|
|
3741
|
+
function buildUpdateProposalOp(proposalId, creator, dailyPay, subject, permlink) {
|
|
3742
|
+
if (proposalId === void 0 || proposalId === null || typeof proposalId !== "number" || !creator || !dailyPay || !subject || !permlink) {
|
|
3743
|
+
throw new Error("[SDK][buildUpdateProposalOp] Missing required parameters");
|
|
3744
|
+
}
|
|
3745
|
+
return [
|
|
3746
|
+
"update_proposal",
|
|
3747
|
+
{
|
|
3748
|
+
proposal_id: proposalId,
|
|
3749
|
+
creator,
|
|
3750
|
+
daily_pay: dailyPay,
|
|
3751
|
+
subject,
|
|
3752
|
+
permlink,
|
|
3753
|
+
extensions: []
|
|
3754
|
+
}
|
|
3755
|
+
];
|
|
3756
|
+
}
|
|
3757
|
+
|
|
3758
|
+
// src/modules/operations/builders/community.ts
|
|
3759
|
+
function buildSubscribeOp(username, community) {
|
|
3760
|
+
if (!username || !community) {
|
|
3761
|
+
throw new Error("[SDK][buildSubscribeOp] Missing required parameters");
|
|
3762
|
+
}
|
|
3763
|
+
return [
|
|
3764
|
+
"custom_json",
|
|
3811
3765
|
{
|
|
3812
|
-
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
request_id: requestId
|
|
3766
|
+
id: "community",
|
|
3767
|
+
json: JSON.stringify(["subscribe", { community }]),
|
|
3768
|
+
required_auths: [],
|
|
3769
|
+
required_posting_auths: [username]
|
|
3817
3770
|
}
|
|
3818
3771
|
];
|
|
3819
3772
|
}
|
|
3820
|
-
function
|
|
3821
|
-
if (!
|
|
3822
|
-
throw new Error("[SDK][
|
|
3773
|
+
function buildUnsubscribeOp(username, community) {
|
|
3774
|
+
if (!username || !community) {
|
|
3775
|
+
throw new Error("[SDK][buildUnsubscribeOp] Missing required parameters");
|
|
3823
3776
|
}
|
|
3824
3777
|
return [
|
|
3825
|
-
"
|
|
3778
|
+
"custom_json",
|
|
3826
3779
|
{
|
|
3827
|
-
|
|
3828
|
-
|
|
3780
|
+
id: "community",
|
|
3781
|
+
json: JSON.stringify(["unsubscribe", { community }]),
|
|
3782
|
+
required_auths: [],
|
|
3783
|
+
required_posting_auths: [username]
|
|
3829
3784
|
}
|
|
3830
3785
|
];
|
|
3831
3786
|
}
|
|
3832
|
-
function
|
|
3833
|
-
if (!
|
|
3834
|
-
throw new Error("[SDK][
|
|
3787
|
+
function buildSetRoleOp(username, community, account, role) {
|
|
3788
|
+
if (!username || !community || !account || !role) {
|
|
3789
|
+
throw new Error("[SDK][buildSetRoleOp] Missing required parameters");
|
|
3835
3790
|
}
|
|
3836
3791
|
return [
|
|
3837
|
-
|
|
3838
|
-
|
|
3792
|
+
"custom_json",
|
|
3793
|
+
{
|
|
3794
|
+
id: "community",
|
|
3795
|
+
json: JSON.stringify(["setRole", { community, account, role }]),
|
|
3796
|
+
required_auths: [],
|
|
3797
|
+
required_posting_auths: [username]
|
|
3798
|
+
}
|
|
3839
3799
|
];
|
|
3840
3800
|
}
|
|
3841
|
-
function
|
|
3842
|
-
if (!
|
|
3843
|
-
throw new Error("[SDK][
|
|
3801
|
+
function buildUpdateCommunityOp(username, community, props) {
|
|
3802
|
+
if (!username || !community || !props) {
|
|
3803
|
+
throw new Error("[SDK][buildUpdateCommunityOp] Missing required parameters");
|
|
3844
3804
|
}
|
|
3845
3805
|
return [
|
|
3846
|
-
"
|
|
3806
|
+
"custom_json",
|
|
3847
3807
|
{
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3808
|
+
id: "community",
|
|
3809
|
+
json: JSON.stringify(["updateProps", { community, props }]),
|
|
3810
|
+
required_auths: [],
|
|
3811
|
+
required_posting_auths: [username]
|
|
3851
3812
|
}
|
|
3852
3813
|
];
|
|
3853
3814
|
}
|
|
3854
|
-
function
|
|
3855
|
-
if (!account || !
|
|
3856
|
-
throw new Error("[SDK][
|
|
3815
|
+
function buildPinPostOp(username, community, account, permlink, pin) {
|
|
3816
|
+
if (!username || !community || !account || !permlink || pin === void 0) {
|
|
3817
|
+
throw new Error("[SDK][buildPinPostOp] Missing required parameters");
|
|
3857
3818
|
}
|
|
3819
|
+
const action = pin ? "pinPost" : "unpinPost";
|
|
3858
3820
|
return [
|
|
3859
|
-
"
|
|
3821
|
+
"custom_json",
|
|
3860
3822
|
{
|
|
3861
|
-
|
|
3862
|
-
|
|
3823
|
+
id: "community",
|
|
3824
|
+
json: JSON.stringify([action, { community, account, permlink }]),
|
|
3825
|
+
required_auths: [],
|
|
3826
|
+
required_posting_auths: [username]
|
|
3863
3827
|
}
|
|
3864
3828
|
];
|
|
3865
3829
|
}
|
|
3866
|
-
function
|
|
3867
|
-
if (!
|
|
3868
|
-
throw new Error("[SDK][
|
|
3830
|
+
function buildMutePostOp(username, community, account, permlink, notes, mute) {
|
|
3831
|
+
if (!username || !community || !account || !permlink || mute === void 0) {
|
|
3832
|
+
throw new Error("[SDK][buildMutePostOp] Missing required parameters");
|
|
3869
3833
|
}
|
|
3834
|
+
const action = mute ? "mutePost" : "unmutePost";
|
|
3870
3835
|
return [
|
|
3871
|
-
"
|
|
3836
|
+
"custom_json",
|
|
3872
3837
|
{
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
|
|
3838
|
+
id: "community",
|
|
3839
|
+
json: JSON.stringify([action, { community, account, permlink, notes }]),
|
|
3840
|
+
required_auths: [],
|
|
3841
|
+
required_posting_auths: [username]
|
|
3876
3842
|
}
|
|
3877
3843
|
];
|
|
3878
3844
|
}
|
|
3879
|
-
function
|
|
3880
|
-
if (!
|
|
3881
|
-
throw new Error("[SDK][
|
|
3882
|
-
}
|
|
3883
|
-
if (percent < 0 || percent > 1e4) {
|
|
3884
|
-
throw new Error("[SDK][buildSetWithdrawVestingRouteOp] Percent must be between 0 and 10000");
|
|
3845
|
+
function buildMuteUserOp(username, community, account, notes, mute) {
|
|
3846
|
+
if (!username || !community || !account || mute === void 0) {
|
|
3847
|
+
throw new Error("[SDK][buildMuteUserOp] Missing required parameters");
|
|
3885
3848
|
}
|
|
3849
|
+
const action = mute ? "muteUser" : "unmuteUser";
|
|
3886
3850
|
return [
|
|
3887
|
-
"
|
|
3851
|
+
"custom_json",
|
|
3888
3852
|
{
|
|
3889
|
-
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
|
|
3853
|
+
id: "community",
|
|
3854
|
+
json: JSON.stringify([action, { community, account, notes }]),
|
|
3855
|
+
required_auths: [],
|
|
3856
|
+
required_posting_auths: [username]
|
|
3893
3857
|
}
|
|
3894
3858
|
];
|
|
3895
3859
|
}
|
|
3896
|
-
function
|
|
3897
|
-
if (!
|
|
3898
|
-
throw new Error("[SDK][
|
|
3860
|
+
function buildFlagPostOp(username, community, account, permlink, notes) {
|
|
3861
|
+
if (!username || !community || !account || !permlink) {
|
|
3862
|
+
throw new Error("[SDK][buildFlagPostOp] Missing required parameters");
|
|
3899
3863
|
}
|
|
3900
3864
|
return [
|
|
3901
|
-
"
|
|
3865
|
+
"custom_json",
|
|
3902
3866
|
{
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3867
|
+
id: "community",
|
|
3868
|
+
json: JSON.stringify(["flagPost", { community, account, permlink, notes }]),
|
|
3869
|
+
required_auths: [],
|
|
3870
|
+
required_posting_auths: [username]
|
|
3906
3871
|
}
|
|
3907
3872
|
];
|
|
3908
3873
|
}
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3874
|
+
|
|
3875
|
+
// src/modules/operations/builders/market.ts
|
|
3876
|
+
var BuySellTransactionType = /* @__PURE__ */ ((BuySellTransactionType2) => {
|
|
3877
|
+
BuySellTransactionType2["Buy"] = "buy";
|
|
3878
|
+
BuySellTransactionType2["Sell"] = "sell";
|
|
3879
|
+
return BuySellTransactionType2;
|
|
3880
|
+
})(BuySellTransactionType || {});
|
|
3881
|
+
var OrderIdPrefix = /* @__PURE__ */ ((OrderIdPrefix2) => {
|
|
3882
|
+
OrderIdPrefix2["EMPTY"] = "";
|
|
3883
|
+
OrderIdPrefix2["SWAP"] = "9";
|
|
3884
|
+
return OrderIdPrefix2;
|
|
3885
|
+
})(OrderIdPrefix || {});
|
|
3886
|
+
function buildLimitOrderCreateOp(owner, amountToSell, minToReceive, fillOrKill, expiration, orderId) {
|
|
3887
|
+
if (!owner || !amountToSell || !minToReceive || !expiration || orderId === void 0) {
|
|
3888
|
+
throw new Error("[SDK][buildLimitOrderCreateOp] Missing required parameters");
|
|
3912
3889
|
}
|
|
3913
3890
|
return [
|
|
3914
|
-
"
|
|
3891
|
+
"limit_order_create",
|
|
3915
3892
|
{
|
|
3916
3893
|
owner,
|
|
3917
|
-
|
|
3918
|
-
|
|
3894
|
+
orderid: orderId,
|
|
3895
|
+
amount_to_sell: amountToSell,
|
|
3896
|
+
min_to_receive: minToReceive,
|
|
3897
|
+
fill_or_kill: fillOrKill,
|
|
3898
|
+
expiration
|
|
3919
3899
|
}
|
|
3920
3900
|
];
|
|
3921
3901
|
}
|
|
3922
|
-
function
|
|
3923
|
-
|
|
3924
|
-
|
|
3902
|
+
function formatNumber(value, decimals = 3) {
|
|
3903
|
+
return value.toFixed(decimals);
|
|
3904
|
+
}
|
|
3905
|
+
function buildLimitOrderCreateOpWithType(owner, amountToSell, minToReceive, orderType, idPrefix = "" /* EMPTY */) {
|
|
3906
|
+
if (!owner || orderType === void 0 || !Number.isFinite(amountToSell) || amountToSell <= 0 || !Number.isFinite(minToReceive) || minToReceive <= 0) {
|
|
3907
|
+
throw new Error("[SDK][buildLimitOrderCreateOpWithType] Missing or invalid parameters");
|
|
3925
3908
|
}
|
|
3926
|
-
const
|
|
3927
|
-
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
|
|
3933
|
-
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
];
|
|
3909
|
+
const expiration = new Date(Date.now());
|
|
3910
|
+
expiration.setDate(expiration.getDate() + 27);
|
|
3911
|
+
const expirationStr = expiration.toISOString().split(".")[0];
|
|
3912
|
+
const orderId = Number(
|
|
3913
|
+
`${idPrefix}${Math.floor(Date.now() / 1e3).toString().slice(2)}`
|
|
3914
|
+
);
|
|
3915
|
+
const formattedAmountToSell = orderType === "buy" /* Buy */ ? `${formatNumber(amountToSell, 3)} HBD` : `${formatNumber(amountToSell, 3)} HIVE`;
|
|
3916
|
+
const formattedMinToReceive = orderType === "buy" /* Buy */ ? `${formatNumber(minToReceive, 3)} HIVE` : `${formatNumber(minToReceive, 3)} HBD`;
|
|
3917
|
+
return buildLimitOrderCreateOp(
|
|
3918
|
+
owner,
|
|
3919
|
+
formattedAmountToSell,
|
|
3920
|
+
formattedMinToReceive,
|
|
3921
|
+
false,
|
|
3922
|
+
expirationStr,
|
|
3923
|
+
orderId
|
|
3924
|
+
);
|
|
3943
3925
|
}
|
|
3944
|
-
|
|
3945
|
-
|
|
3946
|
-
|
|
3947
|
-
if (!follower || !following) {
|
|
3948
|
-
throw new Error("[SDK][buildFollowOp] Missing required parameters");
|
|
3926
|
+
function buildLimitOrderCancelOp(owner, orderId) {
|
|
3927
|
+
if (!owner || orderId === void 0) {
|
|
3928
|
+
throw new Error("[SDK][buildLimitOrderCancelOp] Missing required parameters");
|
|
3949
3929
|
}
|
|
3950
3930
|
return [
|
|
3951
|
-
"
|
|
3931
|
+
"limit_order_cancel",
|
|
3952
3932
|
{
|
|
3953
|
-
|
|
3954
|
-
|
|
3955
|
-
"follow",
|
|
3956
|
-
{
|
|
3957
|
-
follower,
|
|
3958
|
-
following,
|
|
3959
|
-
what: ["blog"]
|
|
3960
|
-
}
|
|
3961
|
-
]),
|
|
3962
|
-
required_auths: [],
|
|
3963
|
-
required_posting_auths: [follower]
|
|
3933
|
+
owner,
|
|
3934
|
+
orderid: orderId
|
|
3964
3935
|
}
|
|
3965
3936
|
];
|
|
3966
3937
|
}
|
|
3967
|
-
function
|
|
3968
|
-
if (!
|
|
3969
|
-
throw new Error("[SDK][
|
|
3938
|
+
function buildClaimRewardBalanceOp(account, rewardHive, rewardHbd, rewardVests) {
|
|
3939
|
+
if (!account || !rewardHive || !rewardHbd || !rewardVests) {
|
|
3940
|
+
throw new Error("[SDK][buildClaimRewardBalanceOp] Missing required parameters");
|
|
3970
3941
|
}
|
|
3971
3942
|
return [
|
|
3972
|
-
"
|
|
3943
|
+
"claim_reward_balance",
|
|
3973
3944
|
{
|
|
3974
|
-
|
|
3975
|
-
|
|
3976
|
-
|
|
3977
|
-
|
|
3978
|
-
follower,
|
|
3979
|
-
following,
|
|
3980
|
-
what: []
|
|
3981
|
-
}
|
|
3982
|
-
]),
|
|
3983
|
-
required_auths: [],
|
|
3984
|
-
required_posting_auths: [follower]
|
|
3945
|
+
account,
|
|
3946
|
+
reward_hive: rewardHive,
|
|
3947
|
+
reward_hbd: rewardHbd,
|
|
3948
|
+
reward_vests: rewardVests
|
|
3985
3949
|
}
|
|
3986
3950
|
];
|
|
3987
3951
|
}
|
|
3988
|
-
|
|
3989
|
-
|
|
3990
|
-
|
|
3952
|
+
|
|
3953
|
+
// src/modules/operations/builders/account.ts
|
|
3954
|
+
function buildAccountUpdateOp(account, owner, active, posting, memoKey, jsonMetadata) {
|
|
3955
|
+
if (!account || !memoKey) {
|
|
3956
|
+
throw new Error("[SDK][buildAccountUpdateOp] Missing required parameters");
|
|
3991
3957
|
}
|
|
3992
3958
|
return [
|
|
3993
|
-
"
|
|
3959
|
+
"account_update",
|
|
3994
3960
|
{
|
|
3995
|
-
|
|
3996
|
-
|
|
3997
|
-
|
|
3998
|
-
|
|
3999
|
-
|
|
4000
|
-
|
|
4001
|
-
what: ["ignore"]
|
|
4002
|
-
}
|
|
4003
|
-
]),
|
|
4004
|
-
required_auths: [],
|
|
4005
|
-
required_posting_auths: [follower]
|
|
3961
|
+
account,
|
|
3962
|
+
owner,
|
|
3963
|
+
active,
|
|
3964
|
+
posting,
|
|
3965
|
+
memo_key: memoKey,
|
|
3966
|
+
json_metadata: jsonMetadata
|
|
4006
3967
|
}
|
|
4007
3968
|
];
|
|
4008
3969
|
}
|
|
4009
|
-
function
|
|
4010
|
-
if (!
|
|
4011
|
-
throw new Error("[SDK][
|
|
4012
|
-
}
|
|
4013
|
-
return buildUnfollowOp(follower, following);
|
|
4014
|
-
}
|
|
4015
|
-
function buildSetLastReadOps(username, date) {
|
|
4016
|
-
if (!username) {
|
|
4017
|
-
throw new Error("[SDK][buildSetLastReadOps] Missing required parameters");
|
|
3970
|
+
function buildAccountUpdate2Op(account, jsonMetadata, postingJsonMetadata, extensions) {
|
|
3971
|
+
if (!account || postingJsonMetadata === void 0) {
|
|
3972
|
+
throw new Error("[SDK][buildAccountUpdate2Op] Missing required parameters");
|
|
4018
3973
|
}
|
|
4019
|
-
|
|
4020
|
-
|
|
4021
|
-
"custom_json",
|
|
3974
|
+
return [
|
|
3975
|
+
"account_update2",
|
|
4022
3976
|
{
|
|
4023
|
-
|
|
4024
|
-
|
|
4025
|
-
|
|
4026
|
-
|
|
3977
|
+
account,
|
|
3978
|
+
json_metadata: jsonMetadata || "",
|
|
3979
|
+
posting_json_metadata: postingJsonMetadata,
|
|
3980
|
+
extensions: extensions || []
|
|
4027
3981
|
}
|
|
4028
3982
|
];
|
|
4029
|
-
|
|
4030
|
-
|
|
3983
|
+
}
|
|
3984
|
+
function buildAccountCreateOp(creator, newAccountName, keys, fee) {
|
|
3985
|
+
if (!creator || !newAccountName || !keys || !fee) {
|
|
3986
|
+
throw new Error("[SDK][buildAccountCreateOp] Missing required parameters");
|
|
3987
|
+
}
|
|
3988
|
+
const owner = {
|
|
3989
|
+
weight_threshold: 1,
|
|
3990
|
+
account_auths: [],
|
|
3991
|
+
key_auths: [[keys.ownerPublicKey, 1]]
|
|
3992
|
+
};
|
|
3993
|
+
const active = {
|
|
3994
|
+
weight_threshold: 1,
|
|
3995
|
+
account_auths: [],
|
|
3996
|
+
key_auths: [[keys.activePublicKey, 1]]
|
|
3997
|
+
};
|
|
3998
|
+
const posting = {
|
|
3999
|
+
weight_threshold: 1,
|
|
4000
|
+
account_auths: [["ecency.app", 1]],
|
|
4001
|
+
key_auths: [[keys.postingPublicKey, 1]]
|
|
4002
|
+
};
|
|
4003
|
+
return [
|
|
4004
|
+
"account_create",
|
|
4031
4005
|
{
|
|
4032
|
-
|
|
4033
|
-
|
|
4034
|
-
|
|
4035
|
-
|
|
4006
|
+
creator,
|
|
4007
|
+
new_account_name: newAccountName,
|
|
4008
|
+
owner,
|
|
4009
|
+
active,
|
|
4010
|
+
posting,
|
|
4011
|
+
memo_key: keys.memoPublicKey,
|
|
4012
|
+
json_metadata: "",
|
|
4013
|
+
extensions: [],
|
|
4014
|
+
fee
|
|
4036
4015
|
}
|
|
4037
4016
|
];
|
|
4038
|
-
return [notifyOp, ecencyNotifyOp];
|
|
4039
4017
|
}
|
|
4040
|
-
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
if (!account || !witness || approve === void 0) {
|
|
4044
|
-
throw new Error("[SDK][buildWitnessVoteOp] Missing required parameters");
|
|
4018
|
+
function buildCreateClaimedAccountOp(creator, newAccountName, keys) {
|
|
4019
|
+
if (!creator || !newAccountName || !keys) {
|
|
4020
|
+
throw new Error("[SDK][buildCreateClaimedAccountOp] Missing required parameters");
|
|
4045
4021
|
}
|
|
4022
|
+
const owner = {
|
|
4023
|
+
weight_threshold: 1,
|
|
4024
|
+
account_auths: [],
|
|
4025
|
+
key_auths: [[keys.ownerPublicKey, 1]]
|
|
4026
|
+
};
|
|
4027
|
+
const active = {
|
|
4028
|
+
weight_threshold: 1,
|
|
4029
|
+
account_auths: [],
|
|
4030
|
+
key_auths: [[keys.activePublicKey, 1]]
|
|
4031
|
+
};
|
|
4032
|
+
const posting = {
|
|
4033
|
+
weight_threshold: 1,
|
|
4034
|
+
account_auths: [["ecency.app", 1]],
|
|
4035
|
+
key_auths: [[keys.postingPublicKey, 1]]
|
|
4036
|
+
};
|
|
4046
4037
|
return [
|
|
4047
|
-
"
|
|
4038
|
+
"create_claimed_account",
|
|
4048
4039
|
{
|
|
4049
|
-
|
|
4050
|
-
|
|
4051
|
-
|
|
4040
|
+
creator,
|
|
4041
|
+
new_account_name: newAccountName,
|
|
4042
|
+
owner,
|
|
4043
|
+
active,
|
|
4044
|
+
posting,
|
|
4045
|
+
memo_key: keys.memoPublicKey,
|
|
4046
|
+
json_metadata: "",
|
|
4047
|
+
extensions: []
|
|
4052
4048
|
}
|
|
4053
4049
|
];
|
|
4054
4050
|
}
|
|
4055
|
-
function
|
|
4056
|
-
if (!
|
|
4057
|
-
throw new Error("[SDK][
|
|
4051
|
+
function buildClaimAccountOp(creator, fee) {
|
|
4052
|
+
if (!creator || !fee) {
|
|
4053
|
+
throw new Error("[SDK][buildClaimAccountOp] Missing required parameters");
|
|
4058
4054
|
}
|
|
4059
4055
|
return [
|
|
4060
|
-
"
|
|
4056
|
+
"claim_account",
|
|
4061
4057
|
{
|
|
4062
|
-
|
|
4063
|
-
|
|
4058
|
+
creator,
|
|
4059
|
+
fee,
|
|
4060
|
+
extensions: []
|
|
4064
4061
|
}
|
|
4065
4062
|
];
|
|
4066
4063
|
}
|
|
4067
|
-
function
|
|
4068
|
-
if (!
|
|
4069
|
-
throw new Error("[SDK][
|
|
4064
|
+
function buildGrantPostingPermissionOp(account, currentPosting, grantedAccount, weightThreshold, memoKey, jsonMetadata) {
|
|
4065
|
+
if (!account || !currentPosting || !grantedAccount || !memoKey) {
|
|
4066
|
+
throw new Error("[SDK][buildGrantPostingPermissionOp] Missing required parameters");
|
|
4070
4067
|
}
|
|
4071
|
-
const
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4068
|
+
const existingIndex = currentPosting.account_auths.findIndex(
|
|
4069
|
+
([acc]) => acc === grantedAccount
|
|
4070
|
+
);
|
|
4071
|
+
const newAccountAuths = [...currentPosting.account_auths];
|
|
4072
|
+
if (existingIndex >= 0) {
|
|
4073
|
+
newAccountAuths[existingIndex] = [grantedAccount, weightThreshold];
|
|
4074
|
+
} else {
|
|
4075
|
+
newAccountAuths.push([grantedAccount, weightThreshold]);
|
|
4077
4076
|
}
|
|
4077
|
+
const newPosting = {
|
|
4078
|
+
...currentPosting,
|
|
4079
|
+
account_auths: newAccountAuths
|
|
4080
|
+
};
|
|
4081
|
+
newPosting.account_auths.sort((a, b) => a[0] > b[0] ? 1 : -1);
|
|
4078
4082
|
return [
|
|
4079
|
-
"
|
|
4083
|
+
"account_update",
|
|
4080
4084
|
{
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
daily_pay: payload.dailyPay,
|
|
4086
|
-
subject: payload.subject,
|
|
4087
|
-
permlink: payload.permlink,
|
|
4088
|
-
extensions: []
|
|
4085
|
+
account,
|
|
4086
|
+
posting: newPosting,
|
|
4087
|
+
memo_key: memoKey,
|
|
4088
|
+
json_metadata: jsonMetadata
|
|
4089
4089
|
}
|
|
4090
4090
|
];
|
|
4091
4091
|
}
|
|
4092
|
-
function
|
|
4093
|
-
if (!
|
|
4094
|
-
throw new Error("[SDK][
|
|
4092
|
+
function buildRevokePostingPermissionOp(account, currentPosting, revokedAccount, memoKey, jsonMetadata) {
|
|
4093
|
+
if (!account || !currentPosting || !revokedAccount || !memoKey) {
|
|
4094
|
+
throw new Error("[SDK][buildRevokePostingPermissionOp] Missing required parameters");
|
|
4095
4095
|
}
|
|
4096
|
+
const newPosting = {
|
|
4097
|
+
...currentPosting,
|
|
4098
|
+
account_auths: currentPosting.account_auths.filter(
|
|
4099
|
+
([acc]) => acc !== revokedAccount
|
|
4100
|
+
)
|
|
4101
|
+
};
|
|
4096
4102
|
return [
|
|
4097
|
-
"
|
|
4103
|
+
"account_update",
|
|
4098
4104
|
{
|
|
4099
|
-
|
|
4100
|
-
|
|
4101
|
-
|
|
4102
|
-
|
|
4105
|
+
account,
|
|
4106
|
+
posting: newPosting,
|
|
4107
|
+
memo_key: memoKey,
|
|
4108
|
+
json_metadata: jsonMetadata
|
|
4103
4109
|
}
|
|
4104
4110
|
];
|
|
4105
4111
|
}
|
|
4106
|
-
function
|
|
4107
|
-
if (!
|
|
4108
|
-
throw new Error("[SDK][
|
|
4112
|
+
function buildChangeRecoveryAccountOp(accountToRecover, newRecoveryAccount, extensions = []) {
|
|
4113
|
+
if (!accountToRecover || !newRecoveryAccount) {
|
|
4114
|
+
throw new Error("[SDK][buildChangeRecoveryAccountOp] Missing required parameters");
|
|
4109
4115
|
}
|
|
4110
4116
|
return [
|
|
4111
|
-
"
|
|
4117
|
+
"change_recovery_account",
|
|
4112
4118
|
{
|
|
4113
|
-
|
|
4114
|
-
|
|
4115
|
-
extensions
|
|
4119
|
+
account_to_recover: accountToRecover,
|
|
4120
|
+
new_recovery_account: newRecoveryAccount,
|
|
4121
|
+
extensions
|
|
4116
4122
|
}
|
|
4117
4123
|
];
|
|
4118
4124
|
}
|
|
4119
|
-
function
|
|
4120
|
-
if (
|
|
4121
|
-
throw new Error("[SDK][
|
|
4125
|
+
function buildRequestAccountRecoveryOp(recoveryAccount, accountToRecover, newOwnerAuthority, extensions = []) {
|
|
4126
|
+
if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {
|
|
4127
|
+
throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");
|
|
4122
4128
|
}
|
|
4123
4129
|
return [
|
|
4124
|
-
"
|
|
4130
|
+
"request_account_recovery",
|
|
4125
4131
|
{
|
|
4126
|
-
|
|
4127
|
-
|
|
4128
|
-
|
|
4129
|
-
|
|
4130
|
-
permlink,
|
|
4131
|
-
extensions: []
|
|
4132
|
+
recovery_account: recoveryAccount,
|
|
4133
|
+
account_to_recover: accountToRecover,
|
|
4134
|
+
new_owner_authority: newOwnerAuthority,
|
|
4135
|
+
extensions
|
|
4132
4136
|
}
|
|
4133
4137
|
];
|
|
4134
4138
|
}
|
|
4135
|
-
|
|
4136
|
-
|
|
4137
|
-
|
|
4138
|
-
if (!username || !community) {
|
|
4139
|
-
throw new Error("[SDK][buildSubscribeOp] Missing required parameters");
|
|
4139
|
+
function buildRecoverAccountOp(accountToRecover, newOwnerAuthority, recentOwnerAuthority, extensions = []) {
|
|
4140
|
+
if (!accountToRecover || !newOwnerAuthority || !recentOwnerAuthority) {
|
|
4141
|
+
throw new Error("[SDK][buildRecoverAccountOp] Missing required parameters");
|
|
4140
4142
|
}
|
|
4141
4143
|
return [
|
|
4142
|
-
"
|
|
4144
|
+
"recover_account",
|
|
4143
4145
|
{
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4146
|
+
account_to_recover: accountToRecover,
|
|
4147
|
+
new_owner_authority: newOwnerAuthority,
|
|
4148
|
+
recent_owner_authority: recentOwnerAuthority,
|
|
4149
|
+
extensions
|
|
4148
4150
|
}
|
|
4149
4151
|
];
|
|
4150
4152
|
}
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4153
|
+
|
|
4154
|
+
// src/modules/operations/builders/ecency.ts
|
|
4155
|
+
function buildBoostOp(user, author, permlink, amount) {
|
|
4156
|
+
if (!user || !author || !permlink || !amount) {
|
|
4157
|
+
throw new Error("[SDK][buildBoostOp] Missing required parameters");
|
|
4154
4158
|
}
|
|
4155
4159
|
return [
|
|
4156
4160
|
"custom_json",
|
|
4157
4161
|
{
|
|
4158
|
-
id: "
|
|
4159
|
-
json: JSON.stringify(
|
|
4160
|
-
|
|
4161
|
-
|
|
4162
|
+
id: "ecency_boost",
|
|
4163
|
+
json: JSON.stringify({
|
|
4164
|
+
user,
|
|
4165
|
+
author,
|
|
4166
|
+
permlink,
|
|
4167
|
+
amount
|
|
4168
|
+
}),
|
|
4169
|
+
required_auths: [user],
|
|
4170
|
+
required_posting_auths: []
|
|
4162
4171
|
}
|
|
4163
4172
|
];
|
|
4164
4173
|
}
|
|
4165
|
-
function
|
|
4166
|
-
if (!
|
|
4167
|
-
throw new Error("[SDK][
|
|
4174
|
+
function buildBoostOpWithPoints(user, author, permlink, points) {
|
|
4175
|
+
if (!user || !author || !permlink || !Number.isFinite(points)) {
|
|
4176
|
+
throw new Error("[SDK][buildBoostOpWithPoints] Missing required parameters");
|
|
4177
|
+
}
|
|
4178
|
+
return buildBoostOp(user, author, permlink, `${points.toFixed(3)} POINT`);
|
|
4179
|
+
}
|
|
4180
|
+
function buildBoostPlusOp(user, account, duration) {
|
|
4181
|
+
if (!user || !account || !Number.isFinite(duration)) {
|
|
4182
|
+
throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");
|
|
4168
4183
|
}
|
|
4169
4184
|
return [
|
|
4170
4185
|
"custom_json",
|
|
4171
4186
|
{
|
|
4172
|
-
id: "
|
|
4173
|
-
json: JSON.stringify(
|
|
4174
|
-
|
|
4175
|
-
|
|
4187
|
+
id: "ecency_boost_plus",
|
|
4188
|
+
json: JSON.stringify({
|
|
4189
|
+
user,
|
|
4190
|
+
account,
|
|
4191
|
+
duration
|
|
4192
|
+
}),
|
|
4193
|
+
required_auths: [user],
|
|
4194
|
+
required_posting_auths: []
|
|
4176
4195
|
}
|
|
4177
4196
|
];
|
|
4178
4197
|
}
|
|
4179
|
-
function
|
|
4180
|
-
if (!
|
|
4181
|
-
throw new Error("[SDK][
|
|
4198
|
+
function buildPromoteOp(user, author, permlink, duration) {
|
|
4199
|
+
if (!user || !author || !permlink || !Number.isFinite(duration)) {
|
|
4200
|
+
throw new Error("[SDK][buildPromoteOp] Missing required parameters");
|
|
4182
4201
|
}
|
|
4183
4202
|
return [
|
|
4184
4203
|
"custom_json",
|
|
4185
4204
|
{
|
|
4186
|
-
id: "
|
|
4187
|
-
json: JSON.stringify(
|
|
4188
|
-
|
|
4189
|
-
|
|
4205
|
+
id: "ecency_promote",
|
|
4206
|
+
json: JSON.stringify({
|
|
4207
|
+
user,
|
|
4208
|
+
author,
|
|
4209
|
+
permlink,
|
|
4210
|
+
duration
|
|
4211
|
+
}),
|
|
4212
|
+
required_auths: [user],
|
|
4213
|
+
required_posting_auths: []
|
|
4190
4214
|
}
|
|
4191
4215
|
];
|
|
4192
4216
|
}
|
|
4193
|
-
function
|
|
4194
|
-
if (!
|
|
4195
|
-
throw new Error("[SDK][
|
|
4217
|
+
function buildPointTransferOp(sender, receiver, amount, memo) {
|
|
4218
|
+
if (!sender || !receiver || !amount) {
|
|
4219
|
+
throw new Error("[SDK][buildPointTransferOp] Missing required parameters");
|
|
4196
4220
|
}
|
|
4197
|
-
const action = pin ? "pinPost" : "unpinPost";
|
|
4198
4221
|
return [
|
|
4199
4222
|
"custom_json",
|
|
4200
4223
|
{
|
|
4201
|
-
id: "
|
|
4202
|
-
json: JSON.stringify(
|
|
4203
|
-
|
|
4204
|
-
|
|
4224
|
+
id: "ecency_point_transfer",
|
|
4225
|
+
json: JSON.stringify({
|
|
4226
|
+
sender,
|
|
4227
|
+
receiver,
|
|
4228
|
+
amount,
|
|
4229
|
+
memo: memo || ""
|
|
4230
|
+
}),
|
|
4231
|
+
required_auths: [sender],
|
|
4232
|
+
required_posting_auths: []
|
|
4205
4233
|
}
|
|
4206
4234
|
];
|
|
4207
4235
|
}
|
|
4208
|
-
function
|
|
4209
|
-
if (!
|
|
4210
|
-
throw new Error("[SDK][
|
|
4236
|
+
function buildMultiPointTransferOps(sender, destinations, amount, memo) {
|
|
4237
|
+
if (!sender || !destinations || !amount) {
|
|
4238
|
+
throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");
|
|
4239
|
+
}
|
|
4240
|
+
const destArray = destinations.trim().split(/[\s,]+/).filter(Boolean);
|
|
4241
|
+
if (destArray.length === 0) {
|
|
4242
|
+
throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");
|
|
4243
|
+
}
|
|
4244
|
+
return destArray.map(
|
|
4245
|
+
(dest) => buildPointTransferOp(sender, dest.trim(), amount, memo)
|
|
4246
|
+
);
|
|
4247
|
+
}
|
|
4248
|
+
function buildCommunityRegistrationOp(name) {
|
|
4249
|
+
if (!name) {
|
|
4250
|
+
throw new Error("[SDK][buildCommunityRegistrationOp] Missing required parameters");
|
|
4211
4251
|
}
|
|
4212
|
-
const action = mute ? "mutePost" : "unmutePost";
|
|
4213
4252
|
return [
|
|
4214
4253
|
"custom_json",
|
|
4215
4254
|
{
|
|
4216
|
-
id: "
|
|
4217
|
-
json: JSON.stringify(
|
|
4218
|
-
|
|
4219
|
-
|
|
4255
|
+
id: "ecency_registration",
|
|
4256
|
+
json: JSON.stringify({
|
|
4257
|
+
name
|
|
4258
|
+
}),
|
|
4259
|
+
required_auths: [name],
|
|
4260
|
+
required_posting_auths: []
|
|
4220
4261
|
}
|
|
4221
4262
|
];
|
|
4222
4263
|
}
|
|
4223
|
-
function
|
|
4224
|
-
if (!username || !
|
|
4225
|
-
throw new Error("[SDK][
|
|
4264
|
+
function buildActiveCustomJsonOp(username, operationId, json) {
|
|
4265
|
+
if (!username || !operationId || !json) {
|
|
4266
|
+
throw new Error("[SDK][buildActiveCustomJsonOp] Missing required parameters");
|
|
4226
4267
|
}
|
|
4227
|
-
const action = mute ? "muteUser" : "unmuteUser";
|
|
4228
4268
|
return [
|
|
4229
4269
|
"custom_json",
|
|
4230
4270
|
{
|
|
4231
|
-
id:
|
|
4232
|
-
json: JSON.stringify(
|
|
4233
|
-
required_auths: [],
|
|
4234
|
-
required_posting_auths: [
|
|
4271
|
+
id: operationId,
|
|
4272
|
+
json: JSON.stringify(json),
|
|
4273
|
+
required_auths: [username],
|
|
4274
|
+
required_posting_auths: []
|
|
4235
4275
|
}
|
|
4236
4276
|
];
|
|
4237
4277
|
}
|
|
4238
|
-
function
|
|
4239
|
-
if (!username || !
|
|
4240
|
-
throw new Error("[SDK][
|
|
4278
|
+
function buildPostingCustomJsonOp(username, operationId, json) {
|
|
4279
|
+
if (!username || !operationId || !json) {
|
|
4280
|
+
throw new Error("[SDK][buildPostingCustomJsonOp] Missing required parameters");
|
|
4241
4281
|
}
|
|
4242
4282
|
return [
|
|
4243
4283
|
"custom_json",
|
|
4244
4284
|
{
|
|
4245
|
-
id:
|
|
4246
|
-
json: JSON.stringify(
|
|
4285
|
+
id: operationId,
|
|
4286
|
+
json: JSON.stringify(json),
|
|
4247
4287
|
required_auths: [],
|
|
4248
4288
|
required_posting_auths: [username]
|
|
4249
4289
|
}
|
|
4250
4290
|
];
|
|
4251
4291
|
}
|
|
4252
4292
|
|
|
4253
|
-
// src/modules/
|
|
4254
|
-
|
|
4255
|
-
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4271
|
-
owner,
|
|
4272
|
-
orderid: orderId,
|
|
4273
|
-
amount_to_sell: amountToSell,
|
|
4274
|
-
min_to_receive: minToReceive,
|
|
4275
|
-
fill_or_kill: fillOrKill,
|
|
4276
|
-
expiration
|
|
4277
|
-
}
|
|
4278
|
-
];
|
|
4293
|
+
// src/modules/accounts/mutations/use-follow.ts
|
|
4294
|
+
function useFollow(username, auth) {
|
|
4295
|
+
return useBroadcastMutation(
|
|
4296
|
+
["accounts", "follow"],
|
|
4297
|
+
username,
|
|
4298
|
+
({ following }) => [
|
|
4299
|
+
buildFollowOp(username, following)
|
|
4300
|
+
],
|
|
4301
|
+
async (_result, variables) => {
|
|
4302
|
+
if (auth?.adapter?.invalidateQueries) {
|
|
4303
|
+
await auth.adapter.invalidateQueries([
|
|
4304
|
+
["accounts", "relations", username, variables.following],
|
|
4305
|
+
["accounts", "full", variables.following]
|
|
4306
|
+
]);
|
|
4307
|
+
}
|
|
4308
|
+
},
|
|
4309
|
+
auth
|
|
4310
|
+
);
|
|
4279
4311
|
}
|
|
4280
|
-
|
|
4281
|
-
|
|
4312
|
+
|
|
4313
|
+
// src/modules/accounts/mutations/use-unfollow.ts
|
|
4314
|
+
function useUnfollow(username, auth) {
|
|
4315
|
+
return useBroadcastMutation(
|
|
4316
|
+
["accounts", "unfollow"],
|
|
4317
|
+
username,
|
|
4318
|
+
({ following }) => [
|
|
4319
|
+
buildUnfollowOp(username, following)
|
|
4320
|
+
],
|
|
4321
|
+
async (_result, variables) => {
|
|
4322
|
+
if (auth?.adapter?.invalidateQueries) {
|
|
4323
|
+
await auth.adapter.invalidateQueries([
|
|
4324
|
+
["accounts", "relations", username, variables.following],
|
|
4325
|
+
["accounts", "full", variables.following]
|
|
4326
|
+
]);
|
|
4327
|
+
}
|
|
4328
|
+
},
|
|
4329
|
+
auth
|
|
4330
|
+
);
|
|
4331
|
+
}
|
|
4332
|
+
function useBookmarkAdd(username, code, onSuccess, onError) {
|
|
4333
|
+
return reactQuery.useMutation({
|
|
4334
|
+
mutationKey: ["accounts", "bookmarks", "add", username],
|
|
4335
|
+
mutationFn: async ({ author, permlink }) => {
|
|
4336
|
+
if (!username || !code) {
|
|
4337
|
+
throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");
|
|
4338
|
+
}
|
|
4339
|
+
const fetchApi = getBoundFetch();
|
|
4340
|
+
const response = await fetchApi(
|
|
4341
|
+
CONFIG.privateApiHost + "/private-api/bookmarks-add",
|
|
4342
|
+
{
|
|
4343
|
+
method: "POST",
|
|
4344
|
+
headers: {
|
|
4345
|
+
"Content-Type": "application/json"
|
|
4346
|
+
},
|
|
4347
|
+
body: JSON.stringify({
|
|
4348
|
+
author,
|
|
4349
|
+
permlink,
|
|
4350
|
+
code
|
|
4351
|
+
})
|
|
4352
|
+
}
|
|
4353
|
+
);
|
|
4354
|
+
return response.json();
|
|
4355
|
+
},
|
|
4356
|
+
onSuccess: () => {
|
|
4357
|
+
onSuccess();
|
|
4358
|
+
getQueryClient().invalidateQueries({
|
|
4359
|
+
queryKey: ["accounts", "bookmarks", username]
|
|
4360
|
+
});
|
|
4361
|
+
},
|
|
4362
|
+
onError
|
|
4363
|
+
});
|
|
4364
|
+
}
|
|
4365
|
+
function useBookmarkDelete(username, code, onSuccess, onError) {
|
|
4366
|
+
return reactQuery.useMutation({
|
|
4367
|
+
mutationKey: ["accounts", "bookmarks", "delete", username],
|
|
4368
|
+
mutationFn: async (bookmarkId) => {
|
|
4369
|
+
if (!username || !code) {
|
|
4370
|
+
throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");
|
|
4371
|
+
}
|
|
4372
|
+
const fetchApi = getBoundFetch();
|
|
4373
|
+
const response = await fetchApi(
|
|
4374
|
+
CONFIG.privateApiHost + "/private-api/bookmarks-delete",
|
|
4375
|
+
{
|
|
4376
|
+
method: "POST",
|
|
4377
|
+
headers: {
|
|
4378
|
+
"Content-Type": "application/json"
|
|
4379
|
+
},
|
|
4380
|
+
body: JSON.stringify({
|
|
4381
|
+
id: bookmarkId,
|
|
4382
|
+
code
|
|
4383
|
+
})
|
|
4384
|
+
}
|
|
4385
|
+
);
|
|
4386
|
+
return response.json();
|
|
4387
|
+
},
|
|
4388
|
+
onSuccess: () => {
|
|
4389
|
+
onSuccess();
|
|
4390
|
+
getQueryClient().invalidateQueries({
|
|
4391
|
+
queryKey: ["accounts", "bookmarks", username]
|
|
4392
|
+
});
|
|
4393
|
+
},
|
|
4394
|
+
onError
|
|
4395
|
+
});
|
|
4396
|
+
}
|
|
4397
|
+
function useAccountFavouriteAdd(username, code, onSuccess, onError) {
|
|
4398
|
+
return reactQuery.useMutation({
|
|
4399
|
+
mutationKey: ["accounts", "favourites", "add", username],
|
|
4400
|
+
mutationFn: async (account) => {
|
|
4401
|
+
if (!username || !code) {
|
|
4402
|
+
throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");
|
|
4403
|
+
}
|
|
4404
|
+
const fetchApi = getBoundFetch();
|
|
4405
|
+
const response = await fetchApi(
|
|
4406
|
+
CONFIG.privateApiHost + "/private-api/favorites-add",
|
|
4407
|
+
{
|
|
4408
|
+
method: "POST",
|
|
4409
|
+
headers: {
|
|
4410
|
+
"Content-Type": "application/json"
|
|
4411
|
+
},
|
|
4412
|
+
body: JSON.stringify({
|
|
4413
|
+
account,
|
|
4414
|
+
code
|
|
4415
|
+
})
|
|
4416
|
+
}
|
|
4417
|
+
);
|
|
4418
|
+
return response.json();
|
|
4419
|
+
},
|
|
4420
|
+
onSuccess: () => {
|
|
4421
|
+
onSuccess();
|
|
4422
|
+
getQueryClient().invalidateQueries({
|
|
4423
|
+
queryKey: ["accounts", "favourites", username]
|
|
4424
|
+
});
|
|
4425
|
+
},
|
|
4426
|
+
onError
|
|
4427
|
+
});
|
|
4282
4428
|
}
|
|
4283
|
-
function
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
|
|
4287
|
-
|
|
4288
|
-
|
|
4289
|
-
|
|
4290
|
-
|
|
4291
|
-
|
|
4292
|
-
|
|
4293
|
-
|
|
4294
|
-
|
|
4295
|
-
|
|
4296
|
-
|
|
4297
|
-
|
|
4298
|
-
|
|
4299
|
-
|
|
4300
|
-
|
|
4301
|
-
|
|
4302
|
-
|
|
4429
|
+
function useAccountFavouriteDelete(username, code, onSuccess, onError) {
|
|
4430
|
+
return reactQuery.useMutation({
|
|
4431
|
+
mutationKey: ["accounts", "favourites", "add", username],
|
|
4432
|
+
mutationFn: async (account) => {
|
|
4433
|
+
if (!username || !code) {
|
|
4434
|
+
throw new Error("[SDK][Account][Bookmarks] \u2013 missing auth");
|
|
4435
|
+
}
|
|
4436
|
+
const fetchApi = getBoundFetch();
|
|
4437
|
+
const response = await fetchApi(
|
|
4438
|
+
CONFIG.privateApiHost + "/private-api/favorites-delete",
|
|
4439
|
+
{
|
|
4440
|
+
method: "POST",
|
|
4441
|
+
headers: {
|
|
4442
|
+
"Content-Type": "application/json"
|
|
4443
|
+
},
|
|
4444
|
+
body: JSON.stringify({
|
|
4445
|
+
account,
|
|
4446
|
+
code
|
|
4447
|
+
})
|
|
4448
|
+
}
|
|
4449
|
+
);
|
|
4450
|
+
return response.json();
|
|
4451
|
+
},
|
|
4452
|
+
onSuccess: () => {
|
|
4453
|
+
onSuccess();
|
|
4454
|
+
getQueryClient().invalidateQueries({
|
|
4455
|
+
queryKey: ["accounts", "favourites", username]
|
|
4456
|
+
});
|
|
4457
|
+
},
|
|
4458
|
+
onError
|
|
4459
|
+
});
|
|
4303
4460
|
}
|
|
4304
|
-
function
|
|
4305
|
-
|
|
4306
|
-
|
|
4307
|
-
|
|
4308
|
-
|
|
4309
|
-
|
|
4310
|
-
|
|
4311
|
-
|
|
4312
|
-
|
|
4313
|
-
}
|
|
4314
|
-
];
|
|
4461
|
+
function dedupeAndSortKeyAuths(existing, additions) {
|
|
4462
|
+
const merged = /* @__PURE__ */ new Map();
|
|
4463
|
+
existing.forEach(([key, weight]) => {
|
|
4464
|
+
merged.set(key.toString(), weight);
|
|
4465
|
+
});
|
|
4466
|
+
additions.forEach(([key, weight]) => {
|
|
4467
|
+
merged.set(key.toString(), weight);
|
|
4468
|
+
});
|
|
4469
|
+
return Array.from(merged.entries()).sort(([keyA], [keyB]) => keyA.localeCompare(keyB)).map(([key, weight]) => [key, weight]);
|
|
4315
4470
|
}
|
|
4316
|
-
function
|
|
4317
|
-
|
|
4318
|
-
|
|
4319
|
-
|
|
4320
|
-
|
|
4321
|
-
|
|
4322
|
-
|
|
4323
|
-
|
|
4324
|
-
|
|
4325
|
-
|
|
4326
|
-
|
|
4327
|
-
|
|
4328
|
-
|
|
4471
|
+
function useAccountUpdateKeyAuths(username, options) {
|
|
4472
|
+
const { data: accountData } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
4473
|
+
return reactQuery.useMutation({
|
|
4474
|
+
mutationKey: ["accounts", "keys-update", username],
|
|
4475
|
+
mutationFn: async ({
|
|
4476
|
+
keys,
|
|
4477
|
+
keepCurrent = false,
|
|
4478
|
+
currentKey,
|
|
4479
|
+
keysToRevoke = [],
|
|
4480
|
+
keysToRevokeByAuthority = {}
|
|
4481
|
+
}) => {
|
|
4482
|
+
if (keys.length === 0) {
|
|
4483
|
+
throw new Error(
|
|
4484
|
+
"[SDK][Update password] \u2013 no new keys provided"
|
|
4485
|
+
);
|
|
4486
|
+
}
|
|
4487
|
+
if (!accountData) {
|
|
4488
|
+
throw new Error(
|
|
4489
|
+
"[SDK][Update password] \u2013 cannot update keys for anon user"
|
|
4490
|
+
);
|
|
4491
|
+
}
|
|
4492
|
+
const prepareAuth = (keyName) => {
|
|
4493
|
+
const auth = R4__namespace.clone(accountData[keyName]);
|
|
4494
|
+
const keysToRevokeForAuthority = keysToRevokeByAuthority[keyName] || [];
|
|
4495
|
+
const allKeysToRevoke = [
|
|
4496
|
+
...keysToRevokeForAuthority,
|
|
4497
|
+
...keysToRevokeByAuthority[keyName] === void 0 ? keysToRevoke : []
|
|
4498
|
+
];
|
|
4499
|
+
const existingKeys = keepCurrent ? auth.key_auths.filter(([key]) => !allKeysToRevoke.includes(key.toString())) : [];
|
|
4500
|
+
auth.key_auths = dedupeAndSortKeyAuths(
|
|
4501
|
+
existingKeys,
|
|
4502
|
+
keys.map(
|
|
4503
|
+
(values, i) => [values[keyName].createPublic().toString(), i + 1]
|
|
4504
|
+
)
|
|
4505
|
+
);
|
|
4506
|
+
return auth;
|
|
4507
|
+
};
|
|
4508
|
+
return CONFIG.hiveClient.broadcast.updateAccount(
|
|
4509
|
+
{
|
|
4510
|
+
account: username,
|
|
4511
|
+
json_metadata: accountData.json_metadata,
|
|
4512
|
+
owner: prepareAuth("owner"),
|
|
4513
|
+
active: prepareAuth("active"),
|
|
4514
|
+
posting: prepareAuth("posting"),
|
|
4515
|
+
// Always use new memo key when adding new keys
|
|
4516
|
+
memo_key: keys[0].memo_key.createPublic().toString()
|
|
4517
|
+
},
|
|
4518
|
+
currentKey
|
|
4519
|
+
);
|
|
4520
|
+
},
|
|
4521
|
+
...options
|
|
4522
|
+
});
|
|
4329
4523
|
}
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4335
|
-
|
|
4336
|
-
|
|
4337
|
-
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
|
|
4345
|
-
|
|
4346
|
-
|
|
4524
|
+
function useAccountUpdatePassword(username, options) {
|
|
4525
|
+
const { data: accountData } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
4526
|
+
const { mutateAsync: updateKeys } = useAccountUpdateKeyAuths(username);
|
|
4527
|
+
return reactQuery.useMutation({
|
|
4528
|
+
mutationKey: ["accounts", "password-update", username],
|
|
4529
|
+
mutationFn: async ({
|
|
4530
|
+
newPassword,
|
|
4531
|
+
currentPassword,
|
|
4532
|
+
keepCurrent
|
|
4533
|
+
}) => {
|
|
4534
|
+
if (!accountData) {
|
|
4535
|
+
throw new Error(
|
|
4536
|
+
"[SDK][Update password] \u2013 cannot update password for anon user"
|
|
4537
|
+
);
|
|
4538
|
+
}
|
|
4539
|
+
const currentKey = dhive.PrivateKey.fromLogin(
|
|
4540
|
+
username,
|
|
4541
|
+
currentPassword,
|
|
4542
|
+
"owner"
|
|
4543
|
+
);
|
|
4544
|
+
return updateKeys({
|
|
4545
|
+
currentKey,
|
|
4546
|
+
keepCurrent,
|
|
4547
|
+
keys: [
|
|
4548
|
+
{
|
|
4549
|
+
owner: dhive.PrivateKey.fromLogin(username, newPassword, "owner"),
|
|
4550
|
+
active: dhive.PrivateKey.fromLogin(username, newPassword, "active"),
|
|
4551
|
+
posting: dhive.PrivateKey.fromLogin(username, newPassword, "posting"),
|
|
4552
|
+
memo_key: dhive.PrivateKey.fromLogin(username, newPassword, "memo")
|
|
4553
|
+
}
|
|
4554
|
+
]
|
|
4555
|
+
});
|
|
4556
|
+
},
|
|
4557
|
+
...options
|
|
4558
|
+
});
|
|
4347
4559
|
}
|
|
4348
|
-
function
|
|
4349
|
-
|
|
4350
|
-
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4560
|
+
function useAccountRevokePosting(username, options, auth) {
|
|
4561
|
+
const queryClient = reactQuery.useQueryClient();
|
|
4562
|
+
const { data } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
4563
|
+
return reactQuery.useMutation({
|
|
4564
|
+
mutationKey: ["accounts", "revoke-posting", data?.name],
|
|
4565
|
+
mutationFn: async ({ accountName, type, key }) => {
|
|
4566
|
+
if (!data) {
|
|
4567
|
+
throw new Error(
|
|
4568
|
+
"[SDK][Accounts] \u2013\xA0cannot revoke posting for anonymous user"
|
|
4569
|
+
);
|
|
4570
|
+
}
|
|
4571
|
+
const posting = R4__namespace.pipe(
|
|
4572
|
+
{},
|
|
4573
|
+
R4__namespace.mergeDeep(data.posting)
|
|
4574
|
+
);
|
|
4575
|
+
posting.account_auths = posting.account_auths.filter(
|
|
4576
|
+
([account]) => account !== accountName
|
|
4577
|
+
);
|
|
4578
|
+
const operationBody = {
|
|
4579
|
+
account: data.name,
|
|
4580
|
+
posting,
|
|
4581
|
+
memo_key: data.memo_key,
|
|
4582
|
+
json_metadata: data.json_metadata
|
|
4583
|
+
};
|
|
4584
|
+
if (type === "key" && key) {
|
|
4585
|
+
return CONFIG.hiveClient.broadcast.updateAccount(operationBody, key);
|
|
4586
|
+
} else if (type === "keychain") {
|
|
4587
|
+
if (!auth?.broadcast) {
|
|
4588
|
+
throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");
|
|
4589
|
+
}
|
|
4590
|
+
return auth.broadcast([["account_update", operationBody]], "active");
|
|
4591
|
+
} else {
|
|
4592
|
+
const params = {
|
|
4593
|
+
callback: `https://ecency.com/@${data.name}/permissions`
|
|
4594
|
+
};
|
|
4595
|
+
return hs__default.default.sendOperation(
|
|
4596
|
+
["account_update", operationBody],
|
|
4597
|
+
params,
|
|
4598
|
+
() => {
|
|
4599
|
+
}
|
|
4600
|
+
);
|
|
4601
|
+
}
|
|
4602
|
+
},
|
|
4603
|
+
onError: options.onError,
|
|
4604
|
+
onSuccess: (resp, payload, ctx) => {
|
|
4605
|
+
options.onSuccess?.(resp, payload, ctx);
|
|
4606
|
+
queryClient.setQueryData(
|
|
4607
|
+
getAccountFullQueryOptions(username).queryKey,
|
|
4608
|
+
(data2) => ({
|
|
4609
|
+
...data2,
|
|
4610
|
+
posting: {
|
|
4611
|
+
...data2?.posting,
|
|
4612
|
+
account_auths: data2?.posting?.account_auths?.filter(
|
|
4613
|
+
([account]) => account !== payload.accountName
|
|
4614
|
+
) ?? []
|
|
4615
|
+
}
|
|
4616
|
+
})
|
|
4617
|
+
);
|
|
4359
4618
|
}
|
|
4360
|
-
|
|
4619
|
+
});
|
|
4361
4620
|
}
|
|
4362
|
-
function
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
|
|
4368
|
-
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
|
|
4374
|
-
|
|
4375
|
-
|
|
4376
|
-
|
|
4377
|
-
|
|
4378
|
-
|
|
4379
|
-
|
|
4380
|
-
|
|
4381
|
-
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
|
|
4387
|
-
|
|
4388
|
-
|
|
4389
|
-
|
|
4390
|
-
|
|
4391
|
-
|
|
4392
|
-
|
|
4393
|
-
|
|
4394
|
-
|
|
4621
|
+
function useAccountUpdateRecovery(username, code, options, auth) {
|
|
4622
|
+
const { data } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
4623
|
+
return reactQuery.useMutation({
|
|
4624
|
+
mutationKey: ["accounts", "recovery", data?.name],
|
|
4625
|
+
mutationFn: async ({ accountName, type, key, email }) => {
|
|
4626
|
+
if (!data) {
|
|
4627
|
+
throw new Error(
|
|
4628
|
+
"[SDK][Accounts] \u2013\xA0cannot change recovery for anonymous user"
|
|
4629
|
+
);
|
|
4630
|
+
}
|
|
4631
|
+
const operationBody = {
|
|
4632
|
+
account_to_recover: data.name,
|
|
4633
|
+
new_recovery_account: accountName,
|
|
4634
|
+
extensions: []
|
|
4635
|
+
};
|
|
4636
|
+
if (type === "ecency") {
|
|
4637
|
+
if (!code) {
|
|
4638
|
+
throw new Error("[SDK][Accounts] \u2013 missing access token");
|
|
4639
|
+
}
|
|
4640
|
+
const fetchApi = getBoundFetch();
|
|
4641
|
+
return fetchApi(CONFIG.privateApiHost + "/private-api/recoveries-add", {
|
|
4642
|
+
method: "POST",
|
|
4643
|
+
body: JSON.stringify({
|
|
4644
|
+
code,
|
|
4645
|
+
email,
|
|
4646
|
+
publicKeys: [
|
|
4647
|
+
...data.owner.key_auths,
|
|
4648
|
+
...data.active.key_auths,
|
|
4649
|
+
...data.posting.key_auths,
|
|
4650
|
+
data.memo_key
|
|
4651
|
+
]
|
|
4652
|
+
})
|
|
4653
|
+
});
|
|
4654
|
+
} else if (type === "key" && key) {
|
|
4655
|
+
return CONFIG.hiveClient.broadcast.sendOperations(
|
|
4656
|
+
[["change_recovery_account", operationBody]],
|
|
4657
|
+
key
|
|
4658
|
+
);
|
|
4659
|
+
} else if (type === "keychain") {
|
|
4660
|
+
if (!auth?.broadcast) {
|
|
4661
|
+
throw new Error("[SDK][Accounts] \u2013 missing keychain broadcaster");
|
|
4662
|
+
}
|
|
4663
|
+
return auth.broadcast([["change_recovery_account", operationBody]], "owner");
|
|
4664
|
+
} else {
|
|
4665
|
+
const params = {
|
|
4666
|
+
callback: `https://ecency.com/@${data.name}/permissions`
|
|
4667
|
+
};
|
|
4668
|
+
return hs__default.default.sendOperation(
|
|
4669
|
+
["change_recovery_account", operationBody],
|
|
4670
|
+
params,
|
|
4671
|
+
() => {
|
|
4672
|
+
}
|
|
4673
|
+
);
|
|
4674
|
+
}
|
|
4675
|
+
},
|
|
4676
|
+
onError: options.onError,
|
|
4677
|
+
onSuccess: options.onSuccess
|
|
4678
|
+
});
|
|
4395
4679
|
}
|
|
4396
|
-
function
|
|
4397
|
-
|
|
4398
|
-
|
|
4399
|
-
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
|
|
4427
|
-
];
|
|
4680
|
+
function useAccountRevokeKey(username, options) {
|
|
4681
|
+
const { data: accountData } = reactQuery.useQuery(getAccountFullQueryOptions(username));
|
|
4682
|
+
return reactQuery.useMutation({
|
|
4683
|
+
mutationKey: ["accounts", "revoke-key", accountData?.name],
|
|
4684
|
+
mutationFn: async ({ currentKey, revokingKey }) => {
|
|
4685
|
+
if (!accountData) {
|
|
4686
|
+
throw new Error(
|
|
4687
|
+
"[SDK][Update password] \u2013 cannot update keys for anon user"
|
|
4688
|
+
);
|
|
4689
|
+
}
|
|
4690
|
+
const prepareAuth = (keyName) => {
|
|
4691
|
+
const auth = R4__namespace.clone(accountData[keyName]);
|
|
4692
|
+
auth.key_auths = auth.key_auths.filter(
|
|
4693
|
+
([key]) => key !== revokingKey.toString()
|
|
4694
|
+
);
|
|
4695
|
+
return auth;
|
|
4696
|
+
};
|
|
4697
|
+
return CONFIG.hiveClient.broadcast.updateAccount(
|
|
4698
|
+
{
|
|
4699
|
+
account: accountData.name,
|
|
4700
|
+
json_metadata: accountData.json_metadata,
|
|
4701
|
+
owner: prepareAuth("owner"),
|
|
4702
|
+
active: prepareAuth("active"),
|
|
4703
|
+
posting: prepareAuth("posting"),
|
|
4704
|
+
memo_key: accountData.memo_key
|
|
4705
|
+
},
|
|
4706
|
+
currentKey
|
|
4707
|
+
);
|
|
4708
|
+
},
|
|
4709
|
+
...options
|
|
4710
|
+
});
|
|
4428
4711
|
}
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
creator,
|
|
4437
|
-
fee,
|
|
4438
|
-
extensions: []
|
|
4439
|
-
}
|
|
4440
|
-
];
|
|
4712
|
+
|
|
4713
|
+
// src/modules/accounts/utils/account-power.ts
|
|
4714
|
+
var HIVE_VOTING_MANA_REGENERATION_SECONDS = 5 * 60 * 60 * 24;
|
|
4715
|
+
function vestsToRshares(vests, votingPowerValue, votePerc) {
|
|
4716
|
+
const vestingShares = vests * 1e6;
|
|
4717
|
+
const power = votingPowerValue * votePerc / 1e4 / 50 + 1;
|
|
4718
|
+
return power * vestingShares / 1e4;
|
|
4441
4719
|
}
|
|
4442
|
-
function
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4720
|
+
function toDhiveAccountForVotingMana(account) {
|
|
4721
|
+
return {
|
|
4722
|
+
id: 0,
|
|
4723
|
+
name: account.name,
|
|
4724
|
+
owner: account.owner,
|
|
4725
|
+
active: account.active,
|
|
4726
|
+
posting: account.posting,
|
|
4727
|
+
memo_key: account.memo_key,
|
|
4728
|
+
json_metadata: account.json_metadata,
|
|
4729
|
+
posting_json_metadata: account.posting_json_metadata,
|
|
4730
|
+
proxy: account.proxy ?? "",
|
|
4731
|
+
last_owner_update: "",
|
|
4732
|
+
last_account_update: "",
|
|
4733
|
+
created: account.created,
|
|
4734
|
+
mined: false,
|
|
4735
|
+
owner_challenged: false,
|
|
4736
|
+
active_challenged: false,
|
|
4737
|
+
last_owner_proved: "",
|
|
4738
|
+
last_active_proved: "",
|
|
4739
|
+
recovery_account: account.recovery_account ?? "",
|
|
4740
|
+
reset_account: "",
|
|
4741
|
+
last_account_recovery: "",
|
|
4742
|
+
comment_count: 0,
|
|
4743
|
+
lifetime_vote_count: 0,
|
|
4744
|
+
post_count: account.post_count,
|
|
4745
|
+
can_vote: true,
|
|
4746
|
+
voting_power: account.voting_power,
|
|
4747
|
+
last_vote_time: account.last_vote_time,
|
|
4748
|
+
voting_manabar: account.voting_manabar,
|
|
4749
|
+
balance: account.balance,
|
|
4750
|
+
savings_balance: account.savings_balance,
|
|
4751
|
+
hbd_balance: account.hbd_balance,
|
|
4752
|
+
hbd_seconds: "0",
|
|
4753
|
+
hbd_seconds_last_update: "",
|
|
4754
|
+
hbd_last_interest_payment: "",
|
|
4755
|
+
savings_hbd_balance: account.savings_hbd_balance,
|
|
4756
|
+
savings_hbd_seconds: account.savings_hbd_seconds,
|
|
4757
|
+
savings_hbd_seconds_last_update: account.savings_hbd_seconds_last_update,
|
|
4758
|
+
savings_hbd_last_interest_payment: account.savings_hbd_last_interest_payment,
|
|
4759
|
+
savings_withdraw_requests: 0,
|
|
4760
|
+
reward_hbd_balance: account.reward_hbd_balance,
|
|
4761
|
+
reward_hive_balance: account.reward_hive_balance,
|
|
4762
|
+
reward_vesting_balance: account.reward_vesting_balance,
|
|
4763
|
+
reward_vesting_hive: account.reward_vesting_hive,
|
|
4764
|
+
curation_rewards: 0,
|
|
4765
|
+
posting_rewards: 0,
|
|
4766
|
+
vesting_shares: account.vesting_shares,
|
|
4767
|
+
delegated_vesting_shares: account.delegated_vesting_shares,
|
|
4768
|
+
received_vesting_shares: account.received_vesting_shares,
|
|
4769
|
+
vesting_withdraw_rate: account.vesting_withdraw_rate,
|
|
4770
|
+
next_vesting_withdrawal: account.next_vesting_withdrawal,
|
|
4771
|
+
withdrawn: account.withdrawn,
|
|
4772
|
+
to_withdraw: account.to_withdraw,
|
|
4773
|
+
withdraw_routes: 0,
|
|
4774
|
+
proxied_vsf_votes: account.proxied_vsf_votes ?? [],
|
|
4775
|
+
witnesses_voted_for: 0,
|
|
4776
|
+
average_bandwidth: 0,
|
|
4777
|
+
lifetime_bandwidth: 0,
|
|
4778
|
+
last_bandwidth_update: "",
|
|
4779
|
+
average_market_bandwidth: 0,
|
|
4780
|
+
lifetime_market_bandwidth: 0,
|
|
4781
|
+
last_market_bandwidth_update: "",
|
|
4782
|
+
last_post: account.last_post,
|
|
4783
|
+
last_root_post: ""
|
|
4458
4784
|
};
|
|
4459
|
-
newPosting.account_auths.sort((a, b) => a[0] > b[0] ? 1 : -1);
|
|
4460
|
-
return [
|
|
4461
|
-
"account_update",
|
|
4462
|
-
{
|
|
4463
|
-
account,
|
|
4464
|
-
posting: newPosting,
|
|
4465
|
-
memo_key: memoKey,
|
|
4466
|
-
json_metadata: jsonMetadata
|
|
4467
|
-
}
|
|
4468
|
-
];
|
|
4469
4785
|
}
|
|
4470
|
-
function
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
...currentPosting,
|
|
4476
|
-
account_auths: currentPosting.account_auths.filter(
|
|
4477
|
-
([acc]) => acc !== revokedAccount
|
|
4478
|
-
)
|
|
4479
|
-
};
|
|
4480
|
-
return [
|
|
4481
|
-
"account_update",
|
|
4482
|
-
{
|
|
4483
|
-
account,
|
|
4484
|
-
posting: newPosting,
|
|
4485
|
-
memo_key: memoKey,
|
|
4486
|
-
json_metadata: jsonMetadata
|
|
4487
|
-
}
|
|
4488
|
-
];
|
|
4786
|
+
function votingPower(account) {
|
|
4787
|
+
const calc = CONFIG.hiveClient.rc.calculateVPMana(
|
|
4788
|
+
toDhiveAccountForVotingMana(account)
|
|
4789
|
+
);
|
|
4790
|
+
return calc.percentage / 100;
|
|
4489
4791
|
}
|
|
4490
|
-
function
|
|
4491
|
-
if (!
|
|
4492
|
-
throw new
|
|
4792
|
+
function powerRechargeTime(power) {
|
|
4793
|
+
if (!Number.isFinite(power)) {
|
|
4794
|
+
throw new TypeError("Voting power must be a finite number");
|
|
4493
4795
|
}
|
|
4494
|
-
|
|
4495
|
-
"
|
|
4496
|
-
{
|
|
4497
|
-
account_to_recover: accountToRecover,
|
|
4498
|
-
new_recovery_account: newRecoveryAccount,
|
|
4499
|
-
extensions
|
|
4500
|
-
}
|
|
4501
|
-
];
|
|
4502
|
-
}
|
|
4503
|
-
function buildRequestAccountRecoveryOp(recoveryAccount, accountToRecover, newOwnerAuthority, extensions = []) {
|
|
4504
|
-
if (!recoveryAccount || !accountToRecover || !newOwnerAuthority) {
|
|
4505
|
-
throw new Error("[SDK][buildRequestAccountRecoveryOp] Missing required parameters");
|
|
4796
|
+
if (power < 0 || power > 100) {
|
|
4797
|
+
throw new RangeError("Voting power must be between 0 and 100");
|
|
4506
4798
|
}
|
|
4507
|
-
|
|
4508
|
-
|
|
4509
|
-
{
|
|
4510
|
-
recovery_account: recoveryAccount,
|
|
4511
|
-
account_to_recover: accountToRecover,
|
|
4512
|
-
new_owner_authority: newOwnerAuthority,
|
|
4513
|
-
extensions
|
|
4514
|
-
}
|
|
4515
|
-
];
|
|
4799
|
+
const missingPower = 100 - power;
|
|
4800
|
+
return missingPower * 100 * HIVE_VOTING_MANA_REGENERATION_SECONDS / 1e4;
|
|
4516
4801
|
}
|
|
4517
|
-
function
|
|
4518
|
-
|
|
4519
|
-
|
|
4802
|
+
function downVotingPower(account) {
|
|
4803
|
+
const totalShares = parseFloat(account.vesting_shares) + parseFloat(account.received_vesting_shares) - parseFloat(account.delegated_vesting_shares);
|
|
4804
|
+
const elapsed = Math.floor(Date.now() / 1e3) - account.downvote_manabar.last_update_time;
|
|
4805
|
+
const maxMana = totalShares * 1e6 / 4;
|
|
4806
|
+
if (maxMana <= 0) {
|
|
4807
|
+
return 0;
|
|
4520
4808
|
}
|
|
4521
|
-
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
account_to_recover: accountToRecover,
|
|
4525
|
-
new_owner_authority: newOwnerAuthority,
|
|
4526
|
-
recent_owner_authority: recentOwnerAuthority,
|
|
4527
|
-
extensions
|
|
4528
|
-
}
|
|
4529
|
-
];
|
|
4530
|
-
}
|
|
4531
|
-
|
|
4532
|
-
// src/modules/operations/builders/ecency.ts
|
|
4533
|
-
function buildBoostOp(user, author, permlink, amount) {
|
|
4534
|
-
if (!user || !author || !permlink || !amount) {
|
|
4535
|
-
throw new Error("[SDK][buildBoostOp] Missing required parameters");
|
|
4809
|
+
let currentMana = parseFloat(account.downvote_manabar.current_mana.toString()) + elapsed * maxMana / HIVE_VOTING_MANA_REGENERATION_SECONDS;
|
|
4810
|
+
if (currentMana > maxMana) {
|
|
4811
|
+
currentMana = maxMana;
|
|
4536
4812
|
}
|
|
4537
|
-
|
|
4538
|
-
|
|
4539
|
-
|
|
4540
|
-
id: "ecency_boost",
|
|
4541
|
-
json: JSON.stringify({
|
|
4542
|
-
user,
|
|
4543
|
-
author,
|
|
4544
|
-
permlink,
|
|
4545
|
-
amount
|
|
4546
|
-
}),
|
|
4547
|
-
required_auths: [user],
|
|
4548
|
-
required_posting_auths: []
|
|
4549
|
-
}
|
|
4550
|
-
];
|
|
4551
|
-
}
|
|
4552
|
-
function buildBoostOpWithPoints(user, author, permlink, points) {
|
|
4553
|
-
if (!user || !author || !permlink || !Number.isFinite(points)) {
|
|
4554
|
-
throw new Error("[SDK][buildBoostOpWithPoints] Missing required parameters");
|
|
4813
|
+
const currentManaPerc = currentMana * 100 / maxMana;
|
|
4814
|
+
if (isNaN(currentManaPerc)) {
|
|
4815
|
+
return 0;
|
|
4555
4816
|
}
|
|
4556
|
-
|
|
4557
|
-
|
|
4558
|
-
function buildBoostPlusOp(user, account, duration) {
|
|
4559
|
-
if (!user || !account || !Number.isFinite(duration)) {
|
|
4560
|
-
throw new Error("[SDK][buildBoostPlusOp] Missing required parameters");
|
|
4817
|
+
if (currentManaPerc > 100) {
|
|
4818
|
+
return 100;
|
|
4561
4819
|
}
|
|
4562
|
-
return
|
|
4563
|
-
"custom_json",
|
|
4564
|
-
{
|
|
4565
|
-
id: "ecency_boost_plus",
|
|
4566
|
-
json: JSON.stringify({
|
|
4567
|
-
user,
|
|
4568
|
-
account,
|
|
4569
|
-
duration
|
|
4570
|
-
}),
|
|
4571
|
-
required_auths: [user],
|
|
4572
|
-
required_posting_auths: []
|
|
4573
|
-
}
|
|
4574
|
-
];
|
|
4820
|
+
return currentManaPerc;
|
|
4575
4821
|
}
|
|
4576
|
-
function
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
}
|
|
4580
|
-
return [
|
|
4581
|
-
"custom_json",
|
|
4582
|
-
{
|
|
4583
|
-
id: "ecency_promote",
|
|
4584
|
-
json: JSON.stringify({
|
|
4585
|
-
user,
|
|
4586
|
-
author,
|
|
4587
|
-
permlink,
|
|
4588
|
-
duration
|
|
4589
|
-
}),
|
|
4590
|
-
required_auths: [user],
|
|
4591
|
-
required_posting_auths: []
|
|
4592
|
-
}
|
|
4593
|
-
];
|
|
4822
|
+
function rcPower(account) {
|
|
4823
|
+
const calc = CONFIG.hiveClient.rc.calculateRCMana(account);
|
|
4824
|
+
return calc.percentage / 100;
|
|
4594
4825
|
}
|
|
4595
|
-
function
|
|
4596
|
-
if (!
|
|
4597
|
-
|
|
4826
|
+
function votingValue(account, dynamicProps, votingPowerValue, weight = 1e4) {
|
|
4827
|
+
if (!Number.isFinite(votingPowerValue) || !Number.isFinite(weight)) {
|
|
4828
|
+
return 0;
|
|
4598
4829
|
}
|
|
4599
|
-
|
|
4600
|
-
|
|
4601
|
-
|
|
4602
|
-
|
|
4603
|
-
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
|
|
4609
|
-
|
|
4610
|
-
|
|
4830
|
+
const { fundRecentClaims, fundRewardBalance, base, quote } = dynamicProps;
|
|
4831
|
+
if (!Number.isFinite(fundRecentClaims) || !Number.isFinite(fundRewardBalance) || !Number.isFinite(base) || !Number.isFinite(quote)) {
|
|
4832
|
+
return 0;
|
|
4833
|
+
}
|
|
4834
|
+
if (fundRecentClaims === 0 || quote === 0) {
|
|
4835
|
+
return 0;
|
|
4836
|
+
}
|
|
4837
|
+
let totalVests = 0;
|
|
4838
|
+
try {
|
|
4839
|
+
const vesting = parseAsset(account.vesting_shares).amount;
|
|
4840
|
+
const received = parseAsset(account.received_vesting_shares).amount;
|
|
4841
|
+
const delegated = parseAsset(account.delegated_vesting_shares).amount;
|
|
4842
|
+
if (![vesting, received, delegated].every(Number.isFinite)) {
|
|
4843
|
+
return 0;
|
|
4611
4844
|
}
|
|
4612
|
-
|
|
4613
|
-
}
|
|
4614
|
-
|
|
4615
|
-
if (!sender || !destinations || !amount) {
|
|
4616
|
-
throw new Error("[SDK][buildMultiPointTransferOps] Missing required parameters");
|
|
4845
|
+
totalVests = vesting + received - delegated;
|
|
4846
|
+
} catch {
|
|
4847
|
+
return 0;
|
|
4617
4848
|
}
|
|
4618
|
-
|
|
4619
|
-
|
|
4620
|
-
throw new Error("[SDK][buildMultiPointTransferOps] Missing valid destinations");
|
|
4849
|
+
if (!Number.isFinite(totalVests)) {
|
|
4850
|
+
return 0;
|
|
4621
4851
|
}
|
|
4622
|
-
|
|
4623
|
-
|
|
4624
|
-
|
|
4852
|
+
const rShares = vestsToRshares(totalVests, votingPowerValue, weight);
|
|
4853
|
+
if (!Number.isFinite(rShares)) {
|
|
4854
|
+
return 0;
|
|
4855
|
+
}
|
|
4856
|
+
return rShares / fundRecentClaims * fundRewardBalance * (base / quote);
|
|
4625
4857
|
}
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4858
|
+
|
|
4859
|
+
// src/modules/operations/authority-map.ts
|
|
4860
|
+
var OPERATION_AUTHORITY_MAP = {
|
|
4861
|
+
// Posting authority operations
|
|
4862
|
+
vote: "posting",
|
|
4863
|
+
comment: "posting",
|
|
4864
|
+
delete_comment: "posting",
|
|
4865
|
+
comment_options: "posting",
|
|
4866
|
+
claim_reward_balance: "posting",
|
|
4867
|
+
// Active authority operations - Financial
|
|
4868
|
+
cancel_transfer_from_savings: "active",
|
|
4869
|
+
collateralized_convert: "active",
|
|
4870
|
+
convert: "active",
|
|
4871
|
+
delegate_vesting_shares: "active",
|
|
4872
|
+
recurrent_transfer: "active",
|
|
4873
|
+
set_withdraw_vesting_route: "active",
|
|
4874
|
+
transfer: "active",
|
|
4875
|
+
transfer_from_savings: "active",
|
|
4876
|
+
transfer_to_savings: "active",
|
|
4877
|
+
transfer_to_vesting: "active",
|
|
4878
|
+
withdraw_vesting: "active",
|
|
4879
|
+
// Active authority operations - Market
|
|
4880
|
+
limit_order_create: "active",
|
|
4881
|
+
limit_order_cancel: "active",
|
|
4882
|
+
// Active authority operations - Account Management
|
|
4883
|
+
account_update: "active",
|
|
4884
|
+
account_update2: "active",
|
|
4885
|
+
create_claimed_account: "active",
|
|
4886
|
+
// Active authority operations - Governance
|
|
4887
|
+
account_witness_proxy: "active",
|
|
4888
|
+
account_witness_vote: "active",
|
|
4889
|
+
remove_proposal: "active",
|
|
4890
|
+
update_proposal_votes: "active",
|
|
4891
|
+
// Owner authority operations - Security & Account Recovery
|
|
4892
|
+
change_recovery_account: "owner",
|
|
4893
|
+
request_account_recovery: "owner",
|
|
4894
|
+
recover_account: "owner",
|
|
4895
|
+
reset_account: "owner",
|
|
4896
|
+
set_reset_account: "owner"
|
|
4897
|
+
// Note: Some operations are handled separately via content inspection:
|
|
4898
|
+
// - custom_json: via getCustomJsonAuthority() - posting or active based on required_auths
|
|
4899
|
+
// - create_proposal/update_proposal: via getProposalAuthority() - typically active
|
|
4900
|
+
};
|
|
4901
|
+
function getCustomJsonAuthority(customJsonOp) {
|
|
4902
|
+
const opType = customJsonOp[0];
|
|
4903
|
+
const payload = customJsonOp[1];
|
|
4904
|
+
if (opType !== "custom_json") {
|
|
4905
|
+
throw new Error("Operation is not a custom_json operation");
|
|
4629
4906
|
}
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
-
|
|
4638
|
-
required_posting_auths: []
|
|
4639
|
-
}
|
|
4640
|
-
];
|
|
4907
|
+
const customJson = payload;
|
|
4908
|
+
if (customJson.required_auths && customJson.required_auths.length > 0) {
|
|
4909
|
+
return "active";
|
|
4910
|
+
}
|
|
4911
|
+
if (customJson.required_posting_auths && customJson.required_posting_auths.length > 0) {
|
|
4912
|
+
return "posting";
|
|
4913
|
+
}
|
|
4914
|
+
return "posting";
|
|
4641
4915
|
}
|
|
4642
|
-
function
|
|
4643
|
-
|
|
4644
|
-
|
|
4916
|
+
function getProposalAuthority(proposalOp) {
|
|
4917
|
+
const opType = proposalOp[0];
|
|
4918
|
+
if (opType !== "create_proposal" && opType !== "update_proposal") {
|
|
4919
|
+
throw new Error("Operation is not a proposal operation");
|
|
4645
4920
|
}
|
|
4646
|
-
return
|
|
4647
|
-
"custom_json",
|
|
4648
|
-
{
|
|
4649
|
-
id: operationId,
|
|
4650
|
-
json: JSON.stringify(json),
|
|
4651
|
-
required_auths: [username],
|
|
4652
|
-
required_posting_auths: []
|
|
4653
|
-
}
|
|
4654
|
-
];
|
|
4921
|
+
return "active";
|
|
4655
4922
|
}
|
|
4656
|
-
function
|
|
4657
|
-
|
|
4658
|
-
|
|
4923
|
+
function getOperationAuthority(op) {
|
|
4924
|
+
const opType = op[0];
|
|
4925
|
+
if (opType === "custom_json") {
|
|
4926
|
+
return getCustomJsonAuthority(op);
|
|
4659
4927
|
}
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
|
|
4663
|
-
|
|
4664
|
-
|
|
4665
|
-
|
|
4666
|
-
|
|
4928
|
+
if (opType === "create_proposal" || opType === "update_proposal") {
|
|
4929
|
+
return getProposalAuthority(op);
|
|
4930
|
+
}
|
|
4931
|
+
return OPERATION_AUTHORITY_MAP[opType] ?? "posting";
|
|
4932
|
+
}
|
|
4933
|
+
function getRequiredAuthority(ops2) {
|
|
4934
|
+
let highestAuthority = "posting";
|
|
4935
|
+
for (const op of ops2) {
|
|
4936
|
+
const authority = getOperationAuthority(op);
|
|
4937
|
+
if (authority === "owner") {
|
|
4938
|
+
return "owner";
|
|
4667
4939
|
}
|
|
4668
|
-
|
|
4940
|
+
if (authority === "active" && highestAuthority === "posting") {
|
|
4941
|
+
highestAuthority = "active";
|
|
4942
|
+
}
|
|
4943
|
+
}
|
|
4944
|
+
return highestAuthority;
|
|
4669
4945
|
}
|
|
4670
4946
|
function useSignOperationByKey(username) {
|
|
4671
4947
|
return reactQuery.useMutation({
|
|
@@ -5458,7 +5734,9 @@ function useComment(username, auth) {
|
|
|
5458
5734
|
if (auth?.adapter?.invalidateQueries) {
|
|
5459
5735
|
const queriesToInvalidate = [
|
|
5460
5736
|
["posts", "feed", username],
|
|
5461
|
-
["posts", "blog", username]
|
|
5737
|
+
["posts", "blog", username],
|
|
5738
|
+
["account", username, "rc"]
|
|
5739
|
+
// RC decreases after posting/commenting
|
|
5462
5740
|
];
|
|
5463
5741
|
if (!isPost) {
|
|
5464
5742
|
queriesToInvalidate.push([
|
|
@@ -5466,6 +5744,14 @@ function useComment(username, auth) {
|
|
|
5466
5744
|
"entry",
|
|
5467
5745
|
`/@${variables.parentAuthor}/${variables.parentPermlink}`
|
|
5468
5746
|
]);
|
|
5747
|
+
const discussionsAuthor = variables.rootAuthor || variables.parentAuthor;
|
|
5748
|
+
const discussionsPermlink = variables.rootPermlink || variables.parentPermlink;
|
|
5749
|
+
queriesToInvalidate.push({
|
|
5750
|
+
predicate: (query) => {
|
|
5751
|
+
const key = query.queryKey;
|
|
5752
|
+
return Array.isArray(key) && key[0] === "posts" && key[1] === "discussions" && key[2] === discussionsAuthor && key[3] === discussionsPermlink;
|
|
5753
|
+
}
|
|
5754
|
+
});
|
|
5469
5755
|
}
|
|
5470
5756
|
await auth.adapter.invalidateQueries(queriesToInvalidate);
|
|
5471
5757
|
}
|
|
@@ -7671,6 +7957,7 @@ exports.NaiMap = NaiMap;
|
|
|
7671
7957
|
exports.NotificationFilter = NotificationFilter;
|
|
7672
7958
|
exports.NotificationViewType = NotificationViewType;
|
|
7673
7959
|
exports.NotifyTypes = NotifyTypes;
|
|
7960
|
+
exports.OPERATION_AUTHORITY_MAP = OPERATION_AUTHORITY_MAP;
|
|
7674
7961
|
exports.OrderIdPrefix = OrderIdPrefix;
|
|
7675
7962
|
exports.ROLES = ROLES;
|
|
7676
7963
|
exports.SortOrder = SortOrder;
|
|
@@ -7792,6 +8079,7 @@ exports.getCurrencyRate = getCurrencyRate;
|
|
|
7792
8079
|
exports.getCurrencyRates = getCurrencyRates;
|
|
7793
8080
|
exports.getCurrencyTokenRate = getCurrencyTokenRate;
|
|
7794
8081
|
exports.getCurrentMedianHistoryPriceQueryOptions = getCurrentMedianHistoryPriceQueryOptions;
|
|
8082
|
+
exports.getCustomJsonAuthority = getCustomJsonAuthority;
|
|
7795
8083
|
exports.getDeletedEntryQueryOptions = getDeletedEntryQueryOptions;
|
|
7796
8084
|
exports.getDiscoverCurationQueryOptions = getDiscoverCurationQueryOptions;
|
|
7797
8085
|
exports.getDiscoverLeaderboardQueryOptions = getDiscoverLeaderboardQueryOptions;
|
|
@@ -7841,6 +8129,7 @@ exports.getNotificationsInfiniteQueryOptions = getNotificationsInfiniteQueryOpti
|
|
|
7841
8129
|
exports.getNotificationsSettingsQueryOptions = getNotificationsSettingsQueryOptions;
|
|
7842
8130
|
exports.getNotificationsUnreadCountQueryOptions = getNotificationsUnreadCountQueryOptions;
|
|
7843
8131
|
exports.getOpenOrdersQueryOptions = getOpenOrdersQueryOptions;
|
|
8132
|
+
exports.getOperationAuthority = getOperationAuthority;
|
|
7844
8133
|
exports.getOrderBookQueryOptions = getOrderBookQueryOptions;
|
|
7845
8134
|
exports.getOutgoingRcDelegationsInfiniteQueryOptions = getOutgoingRcDelegationsInfiniteQueryOptions;
|
|
7846
8135
|
exports.getPageStatsQueryOptions = getPageStatsQueryOptions;
|
|
@@ -7859,6 +8148,7 @@ exports.getProfilesQueryOptions = getProfilesQueryOptions;
|
|
|
7859
8148
|
exports.getPromotePriceQueryOptions = getPromotePriceQueryOptions;
|
|
7860
8149
|
exports.getPromotedPost = getPromotedPost;
|
|
7861
8150
|
exports.getPromotedPostsQuery = getPromotedPostsQuery;
|
|
8151
|
+
exports.getProposalAuthority = getProposalAuthority;
|
|
7862
8152
|
exports.getProposalQueryOptions = getProposalQueryOptions;
|
|
7863
8153
|
exports.getProposalVotesInfiniteQueryOptions = getProposalVotesInfiniteQueryOptions;
|
|
7864
8154
|
exports.getProposalsQueryOptions = getProposalsQueryOptions;
|
|
@@ -7872,6 +8162,7 @@ exports.getReferralsInfiniteQueryOptions = getReferralsInfiniteQueryOptions;
|
|
|
7872
8162
|
exports.getReferralsStatsQueryOptions = getReferralsStatsQueryOptions;
|
|
7873
8163
|
exports.getRelationshipBetweenAccounts = getRelationshipBetweenAccounts;
|
|
7874
8164
|
exports.getRelationshipBetweenAccountsQueryOptions = getRelationshipBetweenAccountsQueryOptions;
|
|
8165
|
+
exports.getRequiredAuthority = getRequiredAuthority;
|
|
7875
8166
|
exports.getRewardFundQueryOptions = getRewardFundQueryOptions;
|
|
7876
8167
|
exports.getRewardedCommunitiesQueryOptions = getRewardedCommunitiesQueryOptions;
|
|
7877
8168
|
exports.getSavingsWithdrawFromQueryOptions = getSavingsWithdrawFromQueryOptions;
|
|
@@ -7960,6 +8251,7 @@ exports.useDeleteDraft = useDeleteDraft;
|
|
|
7960
8251
|
exports.useDeleteImage = useDeleteImage;
|
|
7961
8252
|
exports.useDeleteSchedule = useDeleteSchedule;
|
|
7962
8253
|
exports.useEditFragment = useEditFragment;
|
|
8254
|
+
exports.useFollow = useFollow;
|
|
7963
8255
|
exports.useGameClaim = useGameClaim;
|
|
7964
8256
|
exports.useMarkNotificationsRead = useMarkNotificationsRead;
|
|
7965
8257
|
exports.useMoveSchedule = useMoveSchedule;
|
|
@@ -7971,6 +8263,7 @@ exports.useSignOperationByHivesigner = useSignOperationByHivesigner;
|
|
|
7971
8263
|
exports.useSignOperationByKey = useSignOperationByKey;
|
|
7972
8264
|
exports.useSignOperationByKeychain = useSignOperationByKeychain;
|
|
7973
8265
|
exports.useTransfer = useTransfer;
|
|
8266
|
+
exports.useUnfollow = useUnfollow;
|
|
7974
8267
|
exports.useUpdateDraft = useUpdateDraft;
|
|
7975
8268
|
exports.useUploadImage = useUploadImage;
|
|
7976
8269
|
exports.useVote = useVote;
|